Nun, ich bin Valgrind und Speicher Leck Profiler im Allgemeinen sehr neu. Und ich muss sagen, es ist ein bisschen gruselig, wenn Sie anfangen, sie zu benutzen, weil Sie nicht aufhören können, sich zu fragen, wie viele Lecks Sie vorher vielleicht noch ungelöst gelassen haben!Ist Valgrind verrückt oder ist das ein echter Speicherkartenlecker?
Um den Punkt, als ich bin kein erfahrener C++ - Programmierer, würde ich gerne überprüfen, ob dies sicherlich ein Speicherleck ist oder ist es, dass Valgrind eine falsch positive tut?
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();
Warum ist das? Sollte der Befehl clear nicht den Destruktor jedes Objekts und jeden Vektors aufrufen?
Jetzt, nach ein paar Tests zu tun, fand ich verschiedene Lösungen für das Leck:
1) Löschen:
i->second->push_back(10);
2) Hinzufügen:
delete i->second;
3) Löschen der zweiten
vv.push_back(Vector());
m2.insert(PairVector("two", &vv.back()));
Verwenden von Lösung 2) macht Valgring drucken: 10 Allocs, 11 Frei Ist das OK?
Da ich nicht neu benutze warum sollte ich löschen?
Danke, für jede Hilfe!
Verwenden Sie keine Blockquotes zum Formatieren von Code, verwenden Sie das 101010-Symbol (oder Strg + K). –
Bearbeitet für Code-Format. – Gorpik
Ihre Verwendung von typedefs hat den Code für mich unverständlich gemacht. –