我想使用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提到.
new而不是malloc在c ++中.和STL容器不负责释放在freestore上分配的元素.这意味着您必须明确释放它们.实现这一目标的最佳方法是使用智能指针,使用智能指针,您不必显式释放动态内存,但元素本身负责释放自己的资源.
C++ 的RAII/SBRM功能专门用于避免问题,例如您所面临的问题.