所謂定製刪除器,就是向目標模板提供乙個可以自由選擇析構的介面,這樣做的好處就是可以使智慧型指標模板不再只能單獨管理記憶體,我們還可以用它管理檔案指標之類的東西。其實現方法有兩種,這裡我們以share指標為例。
1.傳遞乙個類的模板引數並給出預設值,模板中將該類設定為成員變數,通過該類(刪除類)的例項化,呼叫類中所存的刪除方法進行刪除。
**如下:
#includetemplate struct del
}};struct free
};struct close
};template>
class sharedptr
sharedptr(t* ptr, deleter del)
:_ptr(ptr)
, _pcount(new long(1))
, _del(del)
{} ~sharedptr()
sharedptr(const sharedptr& sp)
:_ptr(sp._ptr)
, _pcount(sp._pcount)
//sharedptr& operator=(const sharedptr& sp)//傳統寫法
// // return *this;
//}sharedptr& operator=(sharedptrsp)
t& operator*()
t* operator->()
t* getptr()
long getcount()
protected:
void _release() }
protected:
t* _ptr;
long* _pcount;
deleter _del;
};
測試用例如下:
void test2()
2.在智慧型指標的模板中,新增函式指標變數,通過建構函式確定所傳遞的函式指標,用該指標所指向的方法進行刪除。
**如下:
void free()
void del()
void close()
templateclass sharedptr
sharedptr(t* ptr, void(*p)())
:_ptr(ptr)
, _pcount(new long(1))
, del(p)
~sharedptr()
sharedptr(const sharedptr& sp)
:_ptr(sp._ptr)
, _pcount(sp._pcount)
sharedptr& operator=(sharedptrsp)
t& operator*()
t* operator->()
t* getptr()
long getcount()
protected:
void _release() }
protected:
t* _ptr;
long* _pcount;
void(*del)();
};
測試用例如下:
void test1()
本文出自 「pawnsir的it之路」 部落格,請務必保留此出處 兩種智慧型指標 RAII智慧型指標和引用計數智慧型指標
raii的全稱是 resource acquisition is initialization 也就是 資源獲取就是初始化 就像記憶體分配是在變數初始化的時候分配的 比如,當程式結束時,系統會自動釋放程式所使用的資源 函式傳值時,當函式呼叫結束,該值也將消亡。include define safe ...
智慧型指標的簡單實現及兩種誤用方式
最近在自己寫智慧型指標的時候,遇到了一些小的疑惑,也糾正了之前的一些理解上的偏差。首先是最簡單的智慧型指標的乙個實現 templateclass smartpointer 建構函式 t operator t operator smartpointer 這與auto ptr類似,可以完成自動釋放記憶體...
stl的四種智慧型指標
第一種 std auto ptr auto ptr是所有權轉移的智慧型指標,也就是同一時刻只有乙個智慧型指標物件對原物件擁有所有權。第二種 std scoped ptr scoped ptr智慧型指標無法使用乙個物件建立另乙個物件,也無法採用賦值的形式。這無疑提公升了智慧型指標的安全性,但是又存在無...