簡體   English   中英

make shared_ptr不使用delete

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM