将带有malloc指针的类放入映射容器中

Sam*_*iao 1 c++ stl

我想使用map进行键/成员搜索,问题是该类包含malloc调用分配的缓冲区成员.

struct Key {
    int key1;
    int key2;
    bool operator < (Key & a) { .... } 
};

struct Entity {
    unsigned char *data; 
};

typedef std::map(Key, Entity) TMap;
Run Code Online (Sandbox Code Playgroud)

然后我可以用键插入数据,如:

Tmap map;
Key key;
Entity ent;
ent.data = malloc(size);
key.key1 = xx;
key.key2 = xx;

map.insert( ...(key,ent));
Run Code Online (Sandbox Code Playgroud)

问题是我希望删除地图时自动释放"ent.data"指针.同时,我希望在进行地图查找操作时可以访问"数据"来读取缓冲数据.

我试图将析构函数添加到结构实体,但它似乎导致一些重复的免费问题.

解决方案是什么?

[解决方案]:1.使用shared_ptr:

typedef std::tr1:shared_ptr(unsigned char) CharPtr;

struct Entity {
  CharPtr data;
}

ent.data = CharPtr((unsigned char*)malloc(size), free);
Run Code Online (Sandbox Code Playgroud)

或另一种解决方案 使用Vector作为Eugene Homyakov提到.

Alo*_*ave 6

  1. 你应该使用new而不是malloc在c ++中.和
  2. 您应该在容器内使用智能指针而不是原始指针/裸指针.

STL容器负责释放在freestore上分配的元素.这意味着您必须明确释放它们.实现这一目标的最佳方法是使用智能指针,使用智能指针,您不必显式释放动态内存,但元素本身负责释放自己的资源.

C++ 的RAII/SBRM功能专门用于避免问题,例如您所面临的问题.

  • @Eugene Homyakov`一个智能指针在OP仍然使用手动分配的内存时不会解决任何问题 - 这是错误的.您可以使用`malloc`手动分配内存并将其粘贴到`unique_ptr`或`shared_ptr`中,只要您定义一个在两种情况下都调用`free`的客户删除器. (3认同)