我在C++中使用std容器类(列表,映射等)时遇到了一些麻烦。问题似乎是去除容器的物品。我试图存储指向容器内的对象的指针,然后当我想从容器中删除项目时,我使用erase
或remove
。当我这样做时,容器是否真的删除了容器中的对象,或者干脆从容器中移除指针?内存管理和C++容器类
我希望它只是删除指针,因为我使用容器来分组对象,而且对象可能在多个组中,所以我不希望它在被删除时被删除从容器中取出!
谢谢!
我在C++中使用std容器类(列表,映射等)时遇到了一些麻烦。问题似乎是去除容器的物品。我试图存储指向容器内的对象的指针,然后当我想从容器中删除项目时,我使用erase
或remove
。当我这样做时,容器是否真的删除了容器中的对象,或者干脆从容器中移除指针?内存管理和C++容器类
我希望它只是删除指针,因为我使用容器来分组对象,而且对象可能在多个组中,所以我不希望它在被删除时被删除从容器中取出!
谢谢!
当我这样做时,容器是否真的删除了容器中的对象,或者干脆从容器中移除指针?
后者。
...所以我不希望它从容器中删除时被删除!
这实际上是发生了什么,但我仍然想指出std::shared_ptr
,这可以使指针/容器交互更容易。
感谢您的帮助! – 2012-03-01 11:25:03
当我这样做,容器实际上是删除容器中的对象,或者干脆从容器中删除指针?
标准库容器不承担释放指针元素的动态内存的责任。如果要在容器中存储原始指针,则必须自行处理动态内存释放。
这是在C++中的概念来解决您的问题。您可以使用Smart pointer而不是容器内的原始指针,一旦您这样做,取消分配将由智能指针隐式处理,而不是明确处理内存管理的开销。
有许多智能指针可供使用,我有意限制自己建议一个特定的智能指针,因为它具体取决于涉及的对象的所有权和生命周期。检查链接并根据每个智能指针选择合适的智能指针你的要求。
comipler不会删除它放置在堆存储器
由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();
您可以通过将一些调试代码的析构函数检查自己项目,例如'std :: cout'状态吨。无论如何,“一些麻烦”究竟包含什么? – 2012-03-01 11:09:48
感谢破坏者提示。很难找出问题所在,但最终却是解释了破坏的UDP消息并随机崩溃,而不是内存管理问题!只是想确保我正确理解C++容器类。谢谢! – 2012-03-10 10:50:05