我对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();
为什么会这样?难道清空命令不应该调用每个对象和向量的析构函数吗?
现在经过一些测试,我找到了不同的解决方案来解决泄漏问题:
1)删除:
i->second->push_back(10);
2) 添加:
delete i->second;
3)删除第二个
vv.push_back(Vector());
m2.insert(PairVector("two", &vv.back()));
使用解决方案2会使Valgrind打印:10个分配,11个释放。这样可以吗?
既然我没有使用new,为什么要删除呢?
感谢任何帮助!