[英]make shared_ptr not use delete
在我的代碼中,我希望boost :: shared_ptr不要調用delete但是調用ptr-> deleteMe()代替。
我還有一些C風格的函數返回一個ptr。 我可以調用lib_freeXYZ(ptr); 而不是試圖刪除?
或者如何使用stl提供包裝函數 - Doug T.描述但沒有自定義調用者。
boost::shared_ptr<T> ptr( new T, std::mem_fun_ref(&T::deleteMe) );
boost::shared_ptr<S> ptr( new S, std::ptr_fun(lib_freeXYZ) );
您可以為shared_ptr模板提供具有簽名的自定義刪除函數
void Deleter( T* ptr);
對於boost :: shared_ptr
所以對於Deleter你會這樣做
boost::shared_ptr<T> ptrToT( new T, Deleter );
然后在德勒特的身體:
void Deleter( T* ptr);
{
ptr->deleteMe();
// And make sure YOU ACTUALLY DELETE (or do whatever else you need to
// do to release the resource)
delete ptr;
}
對於您需要簡單的特定情況(如ptr-> deleteMe),請參閱Greg的解決方案,非常好。
Doug T.很好地回答了你的問題。 我會告訴你關於intrusive_ptr的事。 也許你也可以在你的項目中使用它。
如果你有一些已經引用計數的C庫,但你必須手動調用這些函數,你也可以使用boost::intrusive_ptr
,並為其add_ref和release函數提供正確的定義。 intrusive_ptr會找到並調用它們。 他們負責增加引用計數並減少它,在需要時釋放資源:
void intrusive_ptr_add_ref(foo *f) {
lib_add_ref(f);
}
void intrusive_ptr_release(foo *f) {
if(lib_dec_ref(f) == 0)
lib_free(f);
}
然后你可以從foo*
類型的原始指針創建對象。 intrusive_ptr將在復制/銷毀時調用您的函數:
intrusive_ptr<foo> f(lib_alloc());
// can wrap raw pointers too, which already may be referenced somewhere else
foo *p = get_foo_from_somewhere();
function_taking_intrusive_ptr(p);
對於C風格的數據,請執行@Doug。 T建議。
對於你的班級,為什么不在析構函數中進行清理? 即使這是在析構函數中包含deleteMe()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.