【问题标题】:Calling clear() on a vector of shared_ptr. Will memory be freed?在 shared_ptr 的向量上调用 clear()。内存会被释放吗?
【发布时间】:2014-09-30 12:22:42
【问题描述】:

我有一个 boost::shared_ptrstd::vector 成员到类中的类 Foo 的对象。 函数SetData() 将指向Foo 的新对象的指针添加到向量中。 Foo 的构造函数对pData 指向的数据进行内部复制。 现在当我调用我的Reset() 函数时,所有内存实际上都会被释放吗?

class myClass()
{
 void SetData(char* pData, size_t nSize)
 {
   boost::shared_ptr<Foo> pFoo(new Foo(pData, nSize));
   mVector.push_back(pFoo);
 }

 void Reset()
 {
   mVector.clear();
 }

private:
    std::vector<boost::shared_ptr<Foo>> mVector;


};

【问题讨论】:

  • 我还有一个问题,如果你不调用 clear 并且 vector 超出范围怎么办。 vector 中的所有智能指针是否都清除了内存?

标签: c++ vector shared-ptr


【解决方案1】:

是的。​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​。

【讨论】:

  • 我还有一个问题,如果他不调用 clear 并且 vector 超出范围怎么办。 vector 中的所有智能指针是否都清除了内存?
【解决方案2】:

真的会释放所有内存吗?

这取决于您的要求。从表面上看,是的。

智能指针的全部目的是它们为您管理内存,而共享指针的全部目的是当没有更多共享指针指向它时,它们指向的东西会自动释放。

当您清除向量时,它包含的共享指针被销毁,并且此操作会自动取消分配任何封装的对象,不再有引用它们的共享指针。

现在,这会释放所有内存吗?不必要。我们不知道Foo 做了什么;如果您没有在其中正确实现 RAII,那么Foo 可能会泄漏内存,答案将变为 no

【讨论】:

  • char* pData 最初指向的数据真的无法评论。总而言之,糟糕的代码,你能做什么?重新开始?
  • @thecoshman:是的,我相信我用“不可能说”来解决这个问题
  • 确实,已发表评论然后刷新以查看您的编辑...但当然,SO 不想公开您编辑...
  • 我还有一个问题,如果他不调用 clear 并且 vector 超出范围怎么办。 vector 中的所有智能指针是否都清除了内存?
猜你喜欢
  • 2012-09-24
  • 2014-06-24
  • 2018-06-21
  • 1970-01-01
  • 2017-07-20
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多