int main()
有時候忘記寫delete,或者寫了,但在程式執行過程中由於某種原因,提前結束了,會造成丟失記憶體
所以,建議使用智慧型指標,不使用裸指標,智慧型指標的資源一定會被釋放,不用自己寫delete
智慧型指標代替普通指標,最基本要提供*運算子和->運算子的過載函式
問題:出現淺拷貝
//解決淺拷貝——拷貝構造
雖然問題解決了,但這樣寫不好,*p3 = 200;是給_ptr = new t;的那塊記憶體進行了賦值,沒有意義。
c++庫里有乙個智慧型指標auto_ptr,可以仿照它,加乙個標誌位。
templateclass csmartptr
const t* operator->()const
void release()const
private:
//標誌位,控制對資源的擁有者,才可以釋放
但這種寫法只能控制乙個資源,多種資源時就不能使用這種方法了。需要使用帶有引用計數的智慧型指標,方便管理資源的開闢和釋放,乙個資源配乙個引用計數。
//引用計數資源的管理類
class cheapmanager
throw"no resource!";
}private:
//資源結點型別
struct resitem
}bool operator==(void *ptr)
void *_paddr;//記錄資源位址
int _refcount;
}; vector_vec;//用來插入、刪除、查詢,存放資源
};templateclass csmartptr
} ~csmartptr()//釋放資源
//拷貝構造
csmartptr(const csmartptr&src):_ptr(src._ptr) }
//賦值運算子過載
csmartptr& operator=(const csmartptr&src)
return *this;
} t& operator*()
const t& operator*()const
t* operator->()
const t* operator->()const
void addref()
void delref()
int getref()
private:
t *_ptr;
//帶有引用計數的智慧型指標,方便管理資源的開闢和釋放
//乙個資源配乙個引用計數
static cheapmanager _heapmanager;//必須在類外初始化
出現問題:同一塊記憶體釋放了兩次,智慧型指標p1,p2的型別不同導致_heapmanager不同,相當於有兩個管理者,兩個都認為這個資源是自己管理的乙個新資源
所謂靜態成員變數,是指同一類物件所共享。
怎麼讓不同型別例項化的智慧型指標擁有同乙個_heapmanager??
1.定義成全域性的
2.採用設計模式 單例模式
用單例模式設計_heapmanager,類不管怎麼產生物件,都只產生乙個物件。
限制使用者不能隨意構造物件,所以第一步要把建構函式寫成私有的。
//引用計數資源的管理類
class cheapmanager
void addref(void *ptr)
throw"no resource!";
}private:
//建構函式寫成私有
cheapmanager(){}
//資源結點型別
struct resitem
}bool operator==(void *ptr)
void *_paddr;//記錄資源位址
int _refcount;
}; vector_vec;//用來插入、刪除、查詢,存放資源
};templateclass csmartptr
} ~csmartptr()//釋放資源
//拷貝構造
csmartptr(const csmartptr&src):_ptr(src._ptr) }
//賦值運算子過載
csmartptr& operator=(const csmartptr&src)
return *this;
} t& operator*()
const t& operator*()const
t* operator->()
const t* operator->()const
void addref()
void delref()
int getref()
private:
t *_ptr;
//用單例模式設計_heapmanager
static cheapmanager &_heapmanager;//用&
問題1:getitance()是不是乙個可重入的函式?
是執行緒安全的
問題2:那這種情況呢?
int i;
//建構函式寫成私有
cheapmanager()
不是執行緒安全的,static cheapmanager _heapmanager;會呼叫建構函式,建構函式中有競態條件發生。
那怎麼寫成執行緒安全的?
class cheapmanager
void addref(void *ptr)
throw"no resource!";
}private:
//建構函式寫成私有
cheapmanager(){}
static cheapmanager _heapmanager;
//資源結點型別
struct resitem
}bool operator==(void *ptr)
void *_paddr;//記錄資源位址
int _refcount;
}; vector_vec;//用來插入、刪除、查詢,存放資源
};cheapmanager cheapmanager::_heapmanager;//初始化
此時就是執行緒安全的。 c 智慧型指標
auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...
c 智慧型指標
很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...
c 智慧型指標
記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...