我在使用C ++中的std容器类(list,map等)时遇到了一些麻烦。问题似乎与删除容器的项目有关。我正在尝试存储指向容器内对象的指针,然后当我想从容器中删除该项时,我使用erase
或remove
。当我这样做时,容器实际上是删除容器中的对象,还是只是从容器中删除指针?
我希望它只是删除指针,因为我正在使用容器对对象进行分组,并且对象可能在多个组中,因此我不希望它在被删除时被删除从一个容器!
谢谢!
答案 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不会删除放在堆内存中的对象