使所有共享ptrs无效到特定的托管对象

时间:2017-01-19 14:37:47

标签: c++ c++11 shared-ptr

在C ++ 11中,是否有可能拥有一个由多个std::shared_ptr管理的对象。我想通过一个std::shared_ptr删除该对象并使另一个shared_ptr无效(设置为空或空),这可能吗?如果没有,通知所有其他"参考"的最佳方法是什么? (在这个词的自由使用中)该对象不再有效?

2 个答案:

答案 0 :(得分:5)

为此,其他shared_ptr必须替换为weak_ptr s。执行删除的shared_ptr是实际管理此方案中对象生命周期的shared_ptr<unique_ptr<T>>。在这一点上值得弄清楚你真的是否需要共享所有权语义。一般来说,如果你发现自己试图做一些界面不允许你做的事情,那就表明你需要一些具有不同语义的东西。

或者,如果你真的无法从一个地方管理对象的生命周期,你可以使用reset,但这更麻烦(更不用说慢),最好避免。在这里,您可以通过unique_ptr内部{{1}}删除对象。

答案 1 :(得分:2)

Hereweak_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已过期