【发布时间】:2010-09-13 15:10:02
【问题描述】:
我在我的代码中广泛使用了boost:shared_ptr。事实上,在堆上分配的大多数对象都由shared_ptr 持有。不幸的是,这意味着我不能将this 传递给任何采用shared_ptr 的函数。考虑这段代码:
void bar(boost::shared_ptr<Foo> pFoo)
{
...
}
void Foo::someFunction()
{
bar(this);
}
这里有两个问题。首先,这不会编译,因为 shared_ptr 的 T* 构造函数是显式的。其次,如果我强制它使用bar(boost::shared_ptr<Foo>(this)) 构建,我将创建第二个指向我的对象的共享指针,最终将导致双重删除。
这让我想到了我的问题:是否有任何标准模式可以从其中一个对象的方法内部获取您知道存在的现有共享指针的副本?在这里使用侵入式引用计数是我唯一的选择吗?
【问题讨论】:
-
"在这里使用侵入式引用计数是我唯一的选择吗?" 这个选项有什么问题?
-
也许没什么。取决于你的情况。它确实使您的对象更大,并且可能无法在您无法控制要保存智能指针的类的地方工作。
-
enabe_shared_from_this 现在位于
std::中。看看我的回答。