gpt4 book ai didi

c++ - 从 map 中删除对象指针时避免内存泄漏

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:48 41 4
gpt4 key购买 nike

我创建了一个 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;

一旦您删除元素,该迭代器就不再有效。您不能取消引用它以获取指向 delete 的指针。最简单的解决方案就是反转这两行:delete then erase

但是,更好的方法是根本不必delete。您真的需要动态分配 Request 吗?你能直接把它存储在 map 中吗?

std::map<int, Request> myMap;

那你就完全不用担心了。只需执行 myMap.erase(it_req);;无需担心 delete。就要考虑的逻辑和代码量而言,这实际上是最简单的解决方案(但可能会对现有代码进行稍微大的更改)。

如果您确实需要动态分配Request,无论出于何种原因,您都可以存储一个智能指针,而不是存储一个原始指针,它会自动删除销毁时指向的对象。默认选择是 std::unique_ptr .

std::map<int, std::unique_ptr<Request>> myMap;

然后你再次只需要做 myMap.erase(it_req);;无需担心手动删除

关于c++ - 从 map 中删除对象指针时避免内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35681215/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com