c++ - 删除 std::shared_ptr 的条件

标签 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?两个都删了吗?这样做的正确方法是什么?我的最终目标是能够拥有一个指向对象的指针 vector ,构造对象并将它们从不同的范围放入该 vector 中,然后在它们创建的范围内删除它们并将它们从 vector 中删除。我的想法是,如果我能以某种方式轻松删除指针的所有实例,那么我只需检查每一帧,从 vector 中删除 shared_ptr(如果它等于 nullptr)。

最佳答案

当您push_back 时,您对插入的内容进行了复制,在本例中为shared_ptr。所以不,对象没有被删除,因为 shared_ptr 的拷贝仍然存在;只要任何 shared_ptr 仍指向该对象,它就会保持事件状态。

我想你要找的是 weak_ptr .如果您从 vector 中提取其中一个,您需要先将其转换为 shared_ptr,然后才能使用它,如果转换失败,您就会知道该对象已被删除。

关于c++ - 删除 std::shared_ptr 的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24813051/

相关文章:

C++ 17 std::filesystem 无法在其他(Windows 10)计算机上运行

C++/Thrift:TThreadedServer::stop() 是线程安全的吗?

Python 箭袋选项

c++ - 返回强制转换枚举值的函数 C++

c++ - Qt 5 将带有参数的插槽分配给 QPushButton

c++ - 什么是 !!在下面的宏中?

c++ - 段错误c++

c++ - 堆栈可以有一个异常安全的方法来返回和删除具有 move 语义的顶部元素吗?

c++ - 自定义双向迭代器的 reverse_iterator 上的 for_each 需要 OutputIterator

关于覆盖资源的 Android 库