内存管理和C ++容器类

时间:2012-03-01 11:06:48

标签: c++ list map containers std

我在使用C ++中的std容器类(list,map等)时遇到了一些麻烦。问题似乎与删除容器的项目有关。我正在尝试存储指向容器内对象的指针,然后当我想从容器中删除该项时,我使用eraseremove。当我这样做时,容器实际上是删除容器中的对象,还是只是从容器中删除指针?

我希望它只是删除指针,因为我正在使用容器对对象进行分组,并且对象可能在多个组中,因此我不希望它在被删除时被删除从一个容器!

谢谢!

4 个答案:

答案 0 :(得分:3)

  

当我这样做时,容器是否实际删除容器中的对象,或者只是从容器中删除指针?

后者。

  

...所以我不希望它从容器中删除时被删除!

这实际上是会发生什么,但我仍然想指出std::shared_ptr,它可以使指针/容器交互更容易。

答案 1 :(得分:2)

  

当我这样做时,容器是否实际删除了容器中的对象,或者只是从容器中删除指针?

标准库容器不负责释放指针元素的动态内存。如果要在容器中存储原始指针,则必须自己解除动态内存的释放。

这就是C ++中 RAII 概念的强大之处。您可以在容器内使用 Smart pointer 而不是原始指针,一旦执行此操作,智能指针将隐式处理释放,而不是您具有显式处理内存管理的开销

有许多智能指针可供使用,我故意限制自己建议使用特定的智能指针,因为它将特别取决于所涉及对象的所有权和生命周期。检查链接并根据您的选择选择合适的智能指针要求。

答案 2 :(得分:1)

Scott Meyer的有效STL将为您提供有关将原始指针存储在容器类中的答案。

如果您不想使用smart_pointers或其他类似的东西,但存储原始指针,如果要清除相关的内存,则必须明确删除它。

在分配时,例如std :: vector,然后在清除它之前,你必须手动删除它的每个元素。

std::vector<int*> v(10;
for (int i=0; i<10; i++)
   v.at(i) = new int;

错误的方式

v.clear(); // !!! MEMORY LEAK 

正确的方法是

for (int i=0; i<10; i++)
    delete v.at(i);

然后

v.clear();

答案 3 :(得分:0)

comipler不会删除放在堆内存中的对象