【问题标题】:Will stl container free memory after deleting heap based object?删除基于堆的对象后,stl 容器会释放内存吗?
【发布时间】:2014-08-13 08:00:29
【问题描述】:

我对 C++ 还很陌生,所以我有这个问题: 我知道 stl 容器不会从堆指针中释放内存,需要自己释放它,而且我知道容器调用被删除对象的析构函数,但是说我们有这个抽象代码:

Object* pObject = new Object();
vector<Object>[i] = *pObject;

现在向量被销毁后,它实际上会释放 pObject 指向的内存吗?或者它只会调用 Object 的析构函数,使其无效并将内存标记为“已占用”以供内存管理器使用?

谢谢。

【问题讨论】:

  • 怎么可能?容器实际上并不包含指针,而是pObject 指向的对象的副本
  • 您没有发布可以编译的代码,但假设您的意思类似于vector&lt;Object&gt; v; ...populate at least i+1 elements...; v[i] = *pObject;,那么分配时pObject 的值将被复制到vector 中索引[i],然后vector 拥有该值的副本,但不拥有仍由pObject 寻址的对象,用户代码仍必须为delete
  • 如果你使用vector&lt;unique_ptr&lt;Object&gt;&gt;它会

标签: c++ memory memory-management


【解决方案1】:

您实际上并没有将pObject 放置在std::vector 中,而是放置了pObject 指向的内容的副本。因此std::vector*pObject 中的对象将完全不同。

std::vector被销毁时,它会调用这个对象副本的析构函数,但是你原来的对象不受影响。 IE。 pObject 仍将指向一个有效对象,并且必须单独为 delete'd。

【讨论】:

  • 这个答案一针见血!
【解决方案2】:

您有一个vector&lt;Object&gt;,因此,vectorObject 不是Object*。在这种情况下根本不需要new

标准容器将管理它们分配的内存,而不是您的。如果您有一个指向具有newed 的对象的指针容器,那么您需要在容器超出范围之前delete 它们。

如果您希望容器(与一些盟友)为您管理内存,请使用std::shared_ptrstd::unique_ptr。如果您的编译器尚不支持 C++11,则有 boosttr1 等效项。

std::vector<std::shared_ptr<Object>> container;

容器将管理智能指针,而智能指针又管理内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-25
    • 2013-06-18
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多