那麼,我一般對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