shared_ptr chain / branch with second deleter

时间:2011-10-28 08:44:23

标签: c++ boost shared-ptr

我有一种情况需要知道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库进行智能指针和绑定。

2 个答案:

答案 0 :(得分:0)

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

创建一个这样的删除函数:

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对象。现在我只需要稍微测试一下。

答案 1 :(得分:0)

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