删除std :: shared_ptr的条件

时间:2014-07-17 20:35:12

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

假设我有以下内容:

class Bar
{
    public:
        int i;
};

class Foo
{
    public:
        std::vector<std::shared_ptr<Bar>> vector;
};

class FooBar
{
    public:
        std::shared_ptr<Bar> myBar;
};

int main()
{
    Foo foo;
    FooBar foobar;

    foobar.myBar = std::make_shared<Bar>();

    foo.vector.push_back(foobar.myBar);

    foobar.myBar = nullptr;
}

myBar和foo.vector.back()是否都等于nullptr?它们都被删除了吗?这样做的正确方法是什么?我的endgoal是能够有一个指向对象的指针向量,构造对象并将它们放入来自不同范围的向量中,然后在它们创建的范围内删除它们并将它们从向量中移除。我的思维过程是,如果我能以某种方式轻易地删除指针的所有实例,那么我可以只检查每一帧,如果它等于nullptr,则从向量中删除shared_ptr。

2 个答案:

答案 0 :(得分:4)

当您push_back对所插入的内容进行复制时,在这种情况下为shared_ptr。所以不,该对象不会被删除,因为shared_ptr的副本仍然存在;只要任何shared_ptr仍然指向对象,它就会保持活着。

我认为你要找的是weak_ptr。如果从向量中提取其中一个,则需要先将其转换为shared_ptr,然后才能使用它,如果转换失败,则表示该对象已被删除。

答案 1 :(得分:0)

创建std::shared_ptr时,有以下选项:

  • 创建一个空的shared_ptr
  • 分享其他shared_ptrweak_ptr
  • 的声明
  • 设置新的声明。

在最后两种情况下,也可以复制指针,或者可以传递(逻辑上)相关指针 以后可以重新考虑这些选择。

仅在最后一个索赔人发布索赔时才会调用清理,(weak_ptr仅计入管理对象。)

重要的是,shared_ptr的副本在共享对象上有自己的声明,并且完全独立于共享该声明的任何其他对象。