在C ++ 11中,是否有可能拥有一个由多个std::shared_ptr
管理的对象。我想通过一个std::shared_ptr
删除该对象并使另一个shared_ptr
无效(设置为空或空),这可能吗?如果没有,通知所有其他"参考"的最佳方法是什么? (在这个词的自由使用中)该对象不再有效?
答案 0 :(得分:5)
为此,其他shared_ptr
必须替换为weak_ptr
s。执行删除的shared_ptr
是实际管理此方案中对象生命周期的shared_ptr<unique_ptr<T>>
。在这一点上值得弄清楚你真的是否需要共享所有权语义。一般来说,如果你发现自己试图做一些界面不允许你做的事情,那就表明你需要一些具有不同语义的东西。
或者,如果你真的无法从一个地方管理对象的生命周期,你可以使用reset
,但这更麻烦(更不用说慢),最好避免。在这里,您可以通过unique_ptr
内部{{1}}删除对象。
答案 1 :(得分:2)
Here是weak_ptr
的一个很好的例子,当所有其他“引用”不再有效时会被通知。
#include <iostream>
#include <memory>
std::weak_ptr<int> gw;
void f()
{
std::cout << "use_count == " << gw.use_count() << ": ";
if (auto spt = gw.lock())
{ // Has to be copied into a shared_ptr before usage
std::cout << *spt << "\n";
}
else
{
std::cout << "gw is expired\n";
}
}
int main()
{
{
std::shared_ptr<int> sp = std::make_shared<int>(42);
gw = sp;
f();
}
f();
}
输出:
use_count == 1:42
use_count == 0:gw已过期