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)
问题出在这里:
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担心.