我有一种情况需要知道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库进行智能指针和绑定。
答案 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
提供一个删除器的简单问题。