智能指針
智能指針的類型
- shared_ptr
實(shí)現(xiàn)共享式擁有的概念(shared ownership)嘶居。多個(gè)智能指針指向相同的對(duì)象厚者,該對(duì)象只有在最后一個(gè)引用被銷毀后釋放躁劣。 - weak_ptr
允許共享但是不擁有對(duì)象。一旦最后一個(gè)擁有該對(duì)象的智能指針銷毀后库菲,任何的weak_ptr會(huì)自動(dòng)置為空账忘。在default和copy 構(gòu)造函數(shù)之外 ,weak_ptr 只提供 “接受一個(gè) shared_ptr” 的構(gòu)造函數(shù)。 - unique_ptr
是 C++11 才開始提供的類型鳖擒,是一種在異常時(shí)可以幫助避免資源泄漏的智能指針溉浙。采用獨(dú)占式擁有,某個(gè)時(shí)刻只能有一個(gè)unique_ptr指向給定的對(duì)象蒋荚。當(dāng)unique_ptr被銷毀時(shí)戳稽,它所指向的對(duì)象也被銷毀。 - auto_ptr
被 c++11 棄用期升,原因是缺乏語言特性如 “針對(duì)構(gòu)造和賦值” 的 std::move 語義惊奇,以及其他瑕疵。
auto_ptr 與 unique_ptr 比較
- auto_ptr 可以賦值拷貝播赁,復(fù)制拷貝后所有權(quán)轉(zhuǎn)移赊时;unqiue_ptr無拷貝賦值語義,但實(shí)現(xiàn)了move語義行拢;
- auto_ptr 對(duì)象不能管理數(shù)組(析構(gòu)調(diào)用 delete)祖秒,unique_ptr可以管理數(shù)組(析構(gòu)調(diào)用delete[]);
shared_ptr代碼簡(jiǎn)單實(shí)現(xiàn)
template <class T> class share_ptr {
private:
class Storage {
private:
int count;
public:
T *pObj;
Storage(T *pObject) {
pObj = pObject;
count = 1;
}
~Storage() {
if (pObj)
delete pObj;
}
void addRef() { count++; }
void remRef() { count--; }
bool noRefs() { return (count == 0); }
};
Storage *storage;
public:
share_ptr(T *pObject) { storage = new Storage(pObject); }
shared_ptr(const shared_ptr &p) {
storage = p.storage;
storage->addRef();
}
~share_ptr() {
storage->remRef();
if (storage->noRefs()) {
delete storage;
}
}
share_ptr &operator=(const share_ptr &p) {
if (this != &p) {
storage->remRef();
if (storage->noRefs()) {
delete storage;
}
storage = p.storage;
storage->addRef();
}
}
T *operator->() { return storage->pObj; }
T &operator*() { return *(storage->pObj); }
};
參考資料
https://github.com/shrddr/Smartpointers/blob/master/shared_ptr.h