删除基于堆的对象后,stl容器是否可以释放内存?

时间:2014-08-13 08:00:29

标签: c++ memory memory-management

我是C ++的新手,所以我有这个问题: 我知道stl容器不会从堆指针中释放内存,需要自己解除分配,我知道容器调用了被删除对象的析构函数,但是我们知道这个抽象代码:

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

现在,在矢量被破坏之后,它实际上会释放内存指向的pObject吗?或者它只会调用Object的析构函数,使其无效并将内存标记为&#34;占用&#34;对于内存管理器?

谢谢。

2 个答案:

答案 0 :(得分:3)

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

std::vector被销毁时,它将调用该对象副本的析构函数,但原始对象不受影响。即pObject仍会指向有效对象,并且必须单独delete

答案 1 :(得分:0)

您有一个vector<Object>vector Object而不是Object*。在这种情况下根本不需要new

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

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

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

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