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

时间:2016-02-28 10:14:09

标签: c++ dictionary pointers std stdmap

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

1 个答案:

答案 0 :(得分:5)

问题在于:

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

元素erase后,迭代器不再有效。您无法取消引用它以获取指向delete的指针。最简单的解决方案就是颠倒这两行:delete 然后 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