make shared_ptr不使用delete

时间:2009-01-13 23:26:48

标签: c++ boost

在我的代码中我希望boost :: shared_ptr不要调用delete而是调用ptr-> deleteMe()代替。

我还有一些返回ptr的C样式函数。我可以调用lib_freeXYZ(ptr);而不是试图删除?

4 个答案:

答案 0 :(得分:56)

或者如何使用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) );

答案 1 :(得分:37)

您可以为shared_ptr模板提供具有签​​名

的自定义删除功能
  void Deleter( T* ptr);

表示boost :: shared_ptr

所以对于Deleter你会做

  boost::shared_ptr<T> ptrToT( new T, Deleter );

然后在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-&gt; deleteMe),请参阅Greg的解决方案,非常好。

答案 2 :(得分:10)

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);

答案 3 :(得分:1)

对于C风格的数据,请执行@Doug。 T建议。

对于你的班级,为什么不在析构函数中进行清理?即使这是在析构函数中包含deleteMe()。