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