下面的代码段:
//container declared
map<string, structA*>& aMap;
// allocation and insertion to container
structA *item = new structA();
aMap["arrDevAddr"] = item;
但是,我迭代并释放地图末尾的地图值(指针)。
现在,由于上面的代码片段,valgrind将我标记为“绝对泄露”的消息。
我想澄清一下编码的一般原则,以避免内存泄漏。根据我的理解,在(C ++编码):
第二种情况:
class A{
...
map<string, structA*>& aMap;
...
}
现在在其他一些类中,插入的地图值为;
if(..)
{ structA item;
aObj->aMap["arrDevAddr"] = &item;
}
...
现在,在这种情况下,由于“item”是范围的本地,地图是否会包含“悬空引用”?如果没有,怎么样? 在这种情况下应该采用什么方式来确保,我们在编码时避免任何内存泄漏?
答案 0 :(得分:3)
自己不要delete
或free
。总是使用内存管理类 - 除非你非常努力地做一些非常愚蠢的事情,否则它们完全不受内存泄漏和相关问题的影响。
在这种情况下,unique_ptr
之类的内容会很好,甚至只是按值存储structA
。
答案 1 :(得分:0)
您可以通过存储std :: unique_ptr而不是原始指针来避免内存泄漏:
#include <iostream>
#include <map>
#include <memory>
#include <string>
struct structA {};
using structA_ptr = std::unique_ptr<structA>;
//container declared
std::map<std::string, structA_ptr> aMap;
using namespace std;
int main()
{
aMap.emplace("bob", structA_ptr { new structA {} });
return 0;
}