当前位置:  开发笔记 > 编程语言 > 正文

make shared_ptr不使用delete

如何解决《makeshared_ptr不使用delete》经验,为你挑选了3个好方法。

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

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



1> Greg Domjan..:

或者如何使用stl提供包装函数 - Doug T.描述但没有自定义调用者.

boost::shared_ptr ptr( new T, std::mem_fun_ref(&T::deleteMe) );
boost::shared_ptr ptr( new S, std::ptr_fun(lib_freeXYZ) );


我其实更喜欢这个,更优雅.

2> Doug T...:

您可以为shared_ptr模板提供具有签​​名的自定义删除函数

  void Deleter( T* ptr);

对于boost :: shared_ptr

所以对于Deleter你会这样做

  boost::shared_ptr 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的解决方案,非常好.



3> Johannes Sch..:

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

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有