我是C ++的新手,所以我有这个问题: 我知道stl容器不会从堆指针中释放内存,需要自己解除分配,我知道容器调用了被删除对象的析构函数,但是我们知道这个抽象代码:
Object* pObject = new Object();
vector<Object>[i] = *pObject;
现在,在矢量被破坏之后,它实际上会释放内存指向的pObject吗?或者它只会调用Object的析构函数,使其无效并将内存标记为&#34;占用&#34;对于内存管理器?
谢谢。
答案 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_ptr
或std::unique_ptr
。如果编译器还不支持C ++ 11,则有boost
和tr1
等效项。
std::vector<std::shared_ptr<Object>> container;
容器将管理智能指针,智能指针又管理内存。