Cóż, jestem bardzo nowy w Valgrind i profilerach wycieków pamięci w ogóle. I muszę powiedzieć, że jest trochę przerażające, kiedy zaczniesz ich używać, ponieważ nie możesz przestać zastanawiać się, ile wycieków jeszcze nie zostałoś rozwiązanych!Czy valgrind jest szalony, czy jest to prawdziwy wyciek pamięci w iteratorze std map?
Do tego stopnia, że nie jestem doświadczonym programistą w C++, chciałbym sprawdzić, czy to z pewnością wyciek pamięci, czy też Valgrind robi fałszywy alarm?
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();
Dlaczego tak jest? Czy polecenie clear nie powinno wywoływać destruktora każdego obiektu i każdego wektora?
Teraz, po wykonaniu kilku testów mogę znaleźć różne rozwiązania wycieku:
1) podczas usuwania
i->second->push_back(10);
2) Dodawanie:
delete i->second;
3) Usuwanie drugiej
vv.push_back(Vector());
m2.insert(PairVector("two", &vv.back()));
Korzystanie z rozwiązania 2) sprawia, że wydruk Valgring: 10 allocentów, 11 zwolnień Czy to w porządku?
Ponieważ nie używam nowych, dlaczego mam usunąć?
Dzięki za pomoc!
Nie używaj cytatów blokad do formatowania kodu, użyj ikony 101010 (lub Ctrl + K). –
Edytowane w celu uzyskania formatu kodu. – Gorpik
Używanie przez ciebie typedefs uczyniło ten kod niezrozumiałym dla mnie. –