【发布时间】:2010-05-20 10:15:47
【问题描述】:
嗯,总的来说,我对 Valgrind 和内存泄漏分析器非常陌生。而且我必须说,当您开始使用它们时会有些害怕,因为您无法停止想知道您之前可能有多少漏洞未解决!
由于我不是 c++ 程序员的经验,我想检查一下这是否肯定是内存泄漏还是 Valgrind 的误报?
typedef std::vector<int> Vector;
typedef std::vector<Vector> VectorVector;
typedef std::map<std::string, Vector*> MapVector;
typedef std::pair<std::string, Vector*> PairVector;
typedef std::map<std::string, Vector*>::iterator IteratorVector;
VectorVector vv;
MapVector m1;
MapVector m2;
vv.push_back(Vector());
m1.insert(PairVector("one", &vv.back()));
vv.push_back(Vector());
m2.insert(PairVector("two", &vv.back()));
IteratorVector i = m1.find("one");
i->second->push_back(10);
m2.insert(PairVector("one", i->second));
m2.clear();
m1.clear();
vv.clear();
这是为什么呢? clear 命令不应该调用每个对象和每个向量的析构函数吗?
现在在做了一些测试后,我发现了不同的泄漏解决方案:
1) 删除:
i->second->push_back(10);
2) 添加:
delete i->second;
3) 删除第二个
vv.push_back(Vector());
m2.insert(PairVector("two", &vv.back()));
使用解决方案 2) 使 Valgring 打印:10 个分配,11 个释放可以吗?
由于我没有使用 new 为什么要删除?
感谢您的帮助!
【问题讨论】:
-
不要使用块引号来格式化代码,使用 101010 图标(或 Ctrl+K)。
-
您对 typedefs 的使用使我无法理解代码。
-
@Marcelo:我认为现在的代码很好。 @Neil,我认为它现在很容易理解,唯一复杂的部分是我有一个向量向量,以及一个指向简单向量的映射...
-
@Alberto Toglia:为什么选择社区维基?
-
@Gorpik,因为该问题已被编辑超过 5 次。它会自动转到 CW。
标签: c++ memory map valgrind memory-leaks