2012-03-01 71 views
0

我在C++中使用std容器类(列表,映射等)时遇到了一些麻烦。问题似乎是去除容器的物品。我试图存储指向容器内的对象的指针,然后当我想从容器中删除项目时,我使用eraseremove。当我这样做时,容器是否真的删除了容器中的对象,或者干脆从容器中移除指针?内存管理和C++容器类

我希望它只是删除指针,因为我使用容器来分组对象,而且对象可能在多个组中,所以我不希望它在被删除时被删除从容器中取出!

谢谢!

+0

您可以通过将一些调试代码的析构函数检查自己项目,例如'std :: cout'状态吨。无论如何,“一些麻烦”究竟包含什么? – 2012-03-01 11:09:48

+0

感谢破坏者提示。很难找出问题所在,但最终却是解释了破坏的UDP消息并随机崩溃,而不是内存管理问题!只是想确保我正确理解C++容器类。谢谢! – 2012-03-10 10:50:05

回答

3

当我这样做时,容器是否真的删除了容器中的对象,或者干脆从容器中移除指针?

后者。

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

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

+0

感谢您的帮助! – 2012-03-01 11:25:03

2

当我这样做,容器实际上是删除容器中的对象,或者干脆从容器中删除指针?

标准库容器不承担释放指针元素的动态内存的责任。如果要在容器中存储原始指针,则必须自行处理动态内存释放。

这是在C++中的概念来解决您的问题。您可以使用Smart pointer而不是容器内的原始指针,一旦您这样做,取消分配将由智能指针隐式处理,而不是明确处理内存管理的开销。

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

0

comipler不会删除它放置在堆存储器

1

由Scott迈耶有效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();