那么,我一般对Valgrind和内存泄漏分析器都很陌生。我必须说,当你开始使用它时有点吓人,因为你不能停止想知道你之前可能还有多少漏洞未被解决!是valgrind疯了还是这是一个真正的std映射迭代器内存泄漏?
因为我不是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释放可以吗?
因为我不使用新的为什么我应该删除?
谢谢,任何帮助!
不要使用块引号格式化代码,请使用101010图标(或Ctrl + K)。 – 2010-05-20 10:20:41
为编码格式编辑。 – Gorpik 2010-05-20 10:24:28
您对typedefs的使用已使代码难以理解。 – 2010-05-20 10:26:43