我有一种情况需要知道 shared_ptr 的用户何时完成,即用户何时最终释放了它的所有拷贝。通常在这里只使用一个删除器,但在这种情况下有一个小问题。底层对象已经是一个 shared_ptr!
也就是说,在伪代码中:
shared_ptr<T> a( new T );
.
.
.
shared_ptr<T> b( a, bind( delete_func, id ) );
我正在从原始的 shared_ptr 生成一个新的分支。这个新的 shared_ptr b
可以像普通的 shared_ptr 一样被复制和使用,但是当这个特定的分支完成时必须调用 delete_func。现在,我不能在这里只使用 a.get()
,因为这个新的 shared_ptr 也必须保留底层对象(它可能是它的最后一个 shared_ptr)。
我正在寻找一种无需彻底更改框架即可执行此操作的方法。有人看到一个好的简单解决方案吗?
我将 boost 库用于智能指针和绑定(bind)。
最佳答案
我想出了一个可能的解决方案。
像这样创建一个删除函数:
void delete_func( int id, shared_ptr<T> underlying );
然后链接 shared_ptr 这样做:
shared_ptr<T> b( a.get(), bind( &delete_func, id, a ) );
这将创建一个带有自定义删除器(我的分支)的新的独立 shared_ptr。其中一个参数是原始的 shared_ptr,因此它也应该维护底层的 shared_ptr 对象。现在我只需要稍微测试一下。
关于c++ - 带有第二个删除器的 shared_ptr 链/分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7926992/