带有第二个删除器的Shared_ptr链/分支

shared_ptr chain/branch with a second deleter

本文关键字:ptr 分支 Shared 第二个 删除      更新时间:2023-10-16

我有一种情况,我需要知道shared_ptr的用户何时完成,即用户何时最终释放了它的所有副本。通常在这里只使用deleter,但是在这种情况下有一个小问题。底层对象已经是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库的智能指针和绑定。

我想到了一个可能的解决方案。

创建一个delete函数:

void delete_func( int id, shared_ptr<T> underlying );

然后链接shared_ptr:

shared_ptr<T> b( a.get(), bind( &delete_func, id, a ) );

这将创建一个带有自定义删除器(my分支)的新的未附加的shared_ptr。其中一个参数是原始的shared_ptr,因此这也应该维护底层的shared_ptr对象。现在我只需要稍微测试一下

我不太明白为什么你想有两个单独的shared_ptr层,为什么不只是提供适当的删除器,将通知你,然后调用指针上的checked_deleter ?这样,您只需要一个删除器,您又回到了为shared_ptr提供一个删除器的简单问题。