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;