【问题标题】:shared_ptr to std::vector of shared_ptr data destruction [duplicate]shared_ptr 到 shared_ptr 数据破坏的 std::vector [重复]
【发布时间】:2015-10-14 07:02:50
【问题描述】:

假设我有一个函数,它返回一个智能指针,指向指向某些数据的智能指针向量。

shared_ptr<vector<shared_ptr<Data>> getVectorPtr();
auto vecPtr = getVectorPtr();

当 vecPtr 超出范围并将被销毁时,其中的 shared_ptrs 是否也会被删除?

仅供参考:智能指针如何在内部意识到它超出了范围?

【问题讨论】:

  • “它如何在内部意识到它超出了范围?”它的析构函数叫做
  • 它有一个计数器(引用计数)。每次超出范围时,它都会减少它,当计数为 0 时,它会调用析构函数。如果你通过值传递它会增加计数,如果你通过引用传递它,计数保持不变
  • 谢谢,应该知道了。当智能指针超出范围时,它的析构函数被调用,它将处理引用计数,如果需要,将删除数据。

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


【解决方案1】:

当外部共享指针超出范围(并且引用计数变为零)时,它会破坏向量。向量依次破坏其元素(内部共享指针)。当元素引用计数也变为零时,内部对象也会被销毁。

因此,在您的情况下,内部元素的破坏取决于可能对它们的其他引用。

【讨论】:

  • 所以如果只有一个对向量的引用,并且它的数据没有在其他任何地方引用(除了向量本身),那么向量的销毁将调用每个指向数据的 shared_ptr 的析构函数,它的引用计数将达到 0,并且数据将被删除。谢谢!
猜你喜欢
  • 2019-10-20
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
相关资源
最近更新 更多