在一个shared_ptr的向量上调用clear(),内存会被释放吗?

3
我有一个类中的std::vector成员,其元素是boost::shared_ptr指向Foo类型对象的指针。 一个名为SetData()的函数将一个指向新的Foo对象的指针添加到该vector中。在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 超出作用域,会发生什么?所有智能指针的内存都会被清除吗? - Mayur
2个回答

11
是的。

我有另一个问题,如果他没有调用clear函数,而vector超出了其作用域,那么内存是否会清除vector中所有智能指针的内容? - Mayur

6
所有内存都会被释放吗?
这取决于你的问题。表面上看,是的。
智能指针的整个目的就是为了管理内存,共享指针的整个目的就是在没有更多共享指针指向它时自动释放所指向的内容。
当你清除向量时,它包含的共享指针被销毁,这个操作会自动释放任何没有更多共享指针引用的封装对象。
现在,是否释放了所有内存?不一定。我们不知道Foo做了什么;如果你没有正确实现RAII,那么Foo可能会泄漏内存,答案就变成了否。

最初由 char* pData 指向的数据实际上无法进行评论。总之,糟糕的代码,你能做什么呢?重新开始吗? - thecoshman
@thecoshman:是的,我相信我已经回答了“无法确定”的问题。 - Lightness Races in Orbit
确实,我发表了评论然后刷新页面看到你的编辑……但当然,SO不想公开你的编辑。 - thecoshman
我有另一个问题,如果他不调用clear而vector超出作用域,会发生什么?内存是否会清除所有向量中的智能指针? - Mayur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接