在c++中删除STL映射中的分配内存
Delete allocated memory in a STL map in C++
我使用映射来存储一对(int和class),使用如下:
#include <iostream>
#include <utility>
#include <map>
using namespace std;
class abstractclass{...};
class derivedclass : public abstractclass{...};
typedef map<int,abstractclass*> dBase;
int main(){
dBase db;
db.insert(pair<int,abstractclass*>(123,new derivedclass));
db.insert(pair<int,abstractclass*>(124,new derivedclass));
}
我如何删除分配给这个内存?我需要能够使用insert
用户定义的次数,所以可以删除每个数据库条目的方法是首选,谢谢!
如果有办法,我可以做到这一点,而不使用内存分配,这也将是有用的
由于你的类层次结构,你显然不能仅仅将abstractclass
对象按值存储在map
中,否则你会遇到臭名昭著的对象切片问题。
std::unique_ptr
或std::shared_ptr
(都是c++ 11,对于c++ 03 永远不要在容器中使用 std::auto_ptr
,因为它是坏的,但你可以安全地使用boost
智能指针代替)。所以你的map
类型会变成eg。std::map<int, std::unique_ptr<abstractclass>>
。那么你就不需要再为删除对象而烦恼了,当它们从映射中删除时,智能指针会自动处理它。
另一个解决方案是自己delete
所有项目(如@MarkB所说),但这是非常容易出错的,所以智能指针通常在可能的情况下首选
只要您的abstractclass
具有虚析构函数,您就可以简单地遍历容器中的所有项,并在delete
中迭代该项的second
组件以释放内存。有多种方法可以做到这一点:例如For循环,或for_each
与函子或lambda。
编辑:经过进一步的审查,地图似乎有所有权,如果你使用shared_ptr
的map
(来自boost或c++ 11),或者使用boost::ptr_map
,你的生活会更轻松。然后你就不用担心清理地图了——你可以使用db.clear();
,所有的物品都会自动清理。这两种容器都有助于在插入重复项时管理内存。
你可以在你的容器中使用智能指针:
#include <iostream>
#include <utility>
#include <map>
#include <memory>
using namespace std;
class abstractclass{...};
class derivedclass : public abstractclass{...};
typedef map<int,shared_ptr<abstractclass>> dBase;
int main(){
dBase db;
shared_ptr<abstractclass> ptr1(new derivedclass);
shared_ptr<abstractclass> ptr2(new derivedclass);
db.insert(pair<int,shared_ptr<abstractclass>>(123,ptr1));
db.insert(pair<int,shared_ptr<abstractclass>>(124,ptr2));
}
共享指针在这里会带来一点开销,但其优点是:
- 你不必担心删除你的对象-他们会被删除一旦地图被破坏。
- 你可以安全地创建一个新对象并尝试将其插入到映射中——如果插入失败(即使有例外),分配的对象将被安全地销毁。
- 你可以插入一个空指针,然后用一个实际创建的值重置它(即不创建一个对象,如果这个键的值已经存在)
相关文章:
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- C++ 将元素分配给映射值时访问错误
- 包含动态分配内存作为值的映射的取消定位速度有多快?
- 如果可能,标准::映射分配是否静态
- 如何在 OpenCL 中使用缓冲区分配和映射内存机制
- 我如何正确地为std ::映射分配内存
- 我如何将输入分配给在 for 循环中设置的映射功能
- 映射和设置总是一次分配一个项目吗
- 静态映射中动态分配的对象.删除必要的
- C++:通过从映射向量分配映射实例来填充映射的映射
- 映射中的分配最终为0
- C 索引中的字符串映射而无需分配
- 循环访问映射并删除动态分配的元素
- 将无序映射与动态分配的用户定义类一起使用
- STL映射是如何分配的?堆叠或堆
- 任何查找分配给映射的内存大小的方法
- 两个映射之间的分配-移动语义和性能
- 动态分配映射指针值
- 在类成员中创建和分配映射
- 如何使用malloc分配映射键