在C++中删除STL映射中的已分配内存

Edd*_*Edd 2 c++ stl map

我使用地图来存储一对(int和类)使用以下内容:

#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));
}
Run Code Online (Sandbox Code Playgroud)

我如何删除分配给它的内存?我需要能够使用insert用户定义的次数,因此可以删除每个数据库条目的方法,谢谢!

如果有一种方法,我可以做到这一点,而不使用也很有用的内存分配

sya*_*yam 10

由于你的类层次结构,你显然不能只是abstractclass按值存储你的对象,map或者你遇到臭名昭着的对象切片问题.

解决此问题的常用方法是使用智能指针,例如.std::unique_ptr或者std::shared_ptr(C++ 11,C++ 03都没有 std::auto_ptr在容器中使用,因为它已经坏了,但你可以安全地使用boost智能指针).

所以你的map类型会变成例如.std::map<int, std::unique_ptr<abstractclass>>.然后,您不再需要打扰删除对象,当它们从地图中删除时,智能指针将自动处理它.

另一个解决方案是自己的delete所有项目(如@MarkB所说),但这非常容易出错,因此在可能的情况下通常首选智能指针.