从地图中删除对象指针时,避免内存泄漏

Nar*_*soo 2 c++ dictionary pointers stdmap std

我创建object_ptr并将其插入到std::map.然后在代码的不同部分,我使用键找到对象并从地图中删除值并删除对象.

虽然似乎存在内存泄漏,我该如何找到并修复它?

void foo(){
    Request * req = new Request();
    MyMap.insert (std::pair<int, Request *> (address, req));
    bar(address);
}
void bar(int address){
  map<int, Request*>::iterator it_req = MyMap.find(address);
  MyMap.erase(it_req);
  delete it_req->second;
}
Run Code Online (Sandbox Code Playgroud)

BoB*_*ish 5

问题出在这里:

MyMap.erase(it_req); 
delete it_req->second; 
Run Code Online (Sandbox Code Playgroud)

一旦你有了erase元素,那迭代器就不再有效了.你不能取消引用它来获取指针delete.最简单的解决方案就是扭转这两条线:delete 那么 erase.

但是,更好的方法是根本不需要delete.你真的需要动态分配Request吗?你能直接把它存放在map

std::map<int, Request> myMap;
Run Code Online (Sandbox Code Playgroud)

那你根本不需要担心.只是做myMap.erase(it_req);; 不用delete担心.就思考逻辑和代码量而言,这实际上是最简单的解决方案(但可能会对现有代码稍微进行一些更改).

如果你确实需要动态分配Request,无论出于何种原因,而不是存储原始指针,你可以存储一个智能指针,delete它将在销毁时自动指向该对象.这个的默认选择是std::unique_ptr.

std::map<int, std::unique_ptr<Request>> myMap;
Run Code Online (Sandbox Code Playgroud)

然后你再次只需要做myMap.erase(it_req);; 没有人工delete担心.