从地图中删除对象指针时避免内存泄漏
Avoid memory leakage when removing object pointer from the map
我创建一个 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;
}
问题出在这里:
MyMap.erase(it_req);
delete it_req->second;
一旦您拥有 erase
d 元素,该迭代器就不再有效。您不能取消引用它以获取指向 delete
的指针。最简单的解决方案就是反转这两行: delete
then 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
。
我创建一个 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;
}
问题出在这里:
MyMap.erase(it_req);
delete it_req->second;
一旦您拥有 erase
d 元素,该迭代器就不再有效。您不能取消引用它以获取指向 delete
的指针。最简单的解决方案就是反转这两行: delete
then 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
。