C++ 从映射中删除对象指针时避免内存泄漏
我创建一个C++ 从映射中删除对象指针时避免内存泄漏,c++,dictionary,pointers,std,stdmap,C++,Dictionary,Pointers,Std,Stdmap,我创建一个对象\u ptr并将其插入std::map。然后在代码的另一部分中,我使用键找到对象,并从贴图中删除值并删除对象 不过,似乎存在内存泄漏,我如何找到并修复它 void foo(){ Request * req = new Request(); MyMap.insert (std::pair<int, Request *> (address, req)); bar(address); } void bar(int address){ map<
对象\u 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;
}
void foo(){
请求*req=新请求();
MyMap.insert(std::pair(address,req));
酒吧(地址);
}
无效条(整数地址){
迭代器it_req=MyMap.find(地址);
MyMap.erase(它需要);
删除它\u req->second;
}
问题在于:
MyMap.erase(it_req);
delete it_req->second;
一旦您删除了元素,迭代器就不再有效。您不能取消对它的引用以获取指向delete
的指针。最简单的解决方案就是颠倒这两行:delete
然后erase
但是,更好的方法是根本不必删除
。您真的需要动态分配请求吗?你能直接把它存储在地图上吗
std::map<int, Request> myMap;
然后你只需要再次执行myMap.erase(它需要)代码>;无需手动删除
。不使用原始指针作为映射类型
。交换删除
和擦除
行。替换擦除和删除命令的顺序没有帮助。我仍然有泄漏问题。我将尝试下一种解决方案。erase()
/delete
是您展示的代码片段中唯一会导致泄漏的问题。也许你看到的具体问题实际上在别处。也许你需要一个新的问题,一个新的问题,这样我们就可以追踪到实际的问题。如果问题出在别处,代码片段是不够的。
std::map<int, std::unique_ptr<Request>> myMap;