使shared_ptr不使用删除

在我的代码我想boost :: shared_ptr不要调用删除,而是调用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 ); 

那么在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的解决scheme,它非常好。

Doug T.很好地回答了你的问题。 我会告诉你关于intrusive_ptr。 也许你也可以在你的项目中使用它。

如果你有一些C库已经引用了计数,但是你必须手动调用这些函数,那么你也可以使用boost::intrusive_ptr ,并且为它的add_ref和release函数提供正确的定义。 intrusive_ptr会查找并调用它们。 他们负责增加引用计数并将其减less,在需要时释放资源:

 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*types的原始指针创build对象。 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一样。 Tbuild议。

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