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

Avoid memory leakage when removing object pointer from the map

我创建一个 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;
}

问题出在这里:

MyMap.erase(it_req); 
delete it_req->second; 

一旦您拥有 erased 元素,该迭代器就不再有效。您不能取消引用它以获取指向 delete 的指针。最简单的解决方案就是反转这两行: delete then erase.

但是,更好的方法是根本不需要 delete。你真的需要动态分配 Request 吗?可以直接存入map吗?

std::map<int, Request> myMap;

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

如果你真的需要动态分配 Request,不管出于什么原因,你可以存储一个智能指针,而不是存储一个原始指针,它会自动 delete 指向销毁时的对象。默认选择是 std::unique_ptr.

std::map<int, std::unique_ptr<Request>> myMap;

然后你只需要做myMap.erase(it_req);;无需担心手册 delete