C++ - Vektoren und Memory Leaks
Habe ich irgendwo gelesen vor einiger Zeit, dass Vektoren Speicherverluste verursachen, je nachdem, wie Sie es gewohnt sind, aber ich würde gerne Fragen, nur um sicher zu sein:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
int main()
{
vector<somePtr*> listPtrs;
return 0;
//Detects memory leaks
}
- Und dies nicht erkennen, was:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
int main()
{
{
vector<somePtr*> listPtrs;
}
return 0;
//No memory leaks detected
}
Sind die Objekte nicht mehr gelöscht werden die Vektoren vor dem löschen der Zeiger.
Ich glaube ich erinnere mich gelesen zu haben, dass Vektoren und Listen und anderen Krankheiten, die Behälter werden automatisch gelöscht, nachdem der block, die Sie in sind, also im Beispiel 1 bekomme ich den memory leak, da der memory-leak-Funktion wird aufgerufen, bevor der block endet, so daß der Vektor ist immer noch lebendig und die, die es verursacht.
Ich bin mir nicht sicher, obwohl es, es ist eine Weile da ich denke, dass ich dies Lesen, und ich konnte nur Fragen über Gegenstände, die nicht gelöscht, nur die Zeiger entfernt werden.
Ist das wahr? Und bekomme ich memory leaks, wenn ich Globale Klassen, enthält, Vektoren und Listen?
std::vector
verursacht keine Speicherlecks, nachlässige Programmierer tun.Sollten Sie auch ein Beispiel, dass tatsächlich weist das Verhalten, das Sie erleben, einschließlich der Aufrufe der CRT-debug-API. Es ist eine gute Möglichkeit, dass Sie falsch interpretieren des Lecks basierend auf, wenn Sie gemeldet werden.
Es gibt keine Speicher-Lecks in einem der beiden Beispiele, die Sie gezeigt haben.
InformationsquelleAutor Danicco | 2013-08-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Punkt, an dem Sie anrufen
_CrtDumpMemoryLeaks
ist wichtig, da alle verwendeten Speicher möglicherweise nicht freigegeben. Zum Beispiel in dem Beispiel unten, wenn Sie den Anruf_CrtDumpMemoryLeaks()
vorlistPtrs
geht out of scope alle Speicher zugewiesen hat, werden in der Liste der Speicherbelegung.Im Beispiel unten
listPtrs
geht out of scope, die vor Aufruf_CrtDumpMemoryLeaks
also alle Speicher zugewiesen hat, wird befreit und nicht in die Blöcke der Speicherbelegung.Ebenso, wenn Sie anrufen
_CrtDumpMemoryLeaks
nach main zurückgegeben hat alle Ressourcen, die vonstd::vector
veröffentlicht werden. Wieder ist dies, weillistPtrs
hat mittlerweile out-of-scope und der Destruktorstd::vector
aufgerufen wurde.Empfehle ich die Verwendung von smart-Pointern anstelle von nackten Zeigern. Es hält Sie warm im winter und Sie nicht haben, um sorgen über die Verwendung von
delete
.InformationsquelleAutor Captain Obvlious
In beiden code-Stücken, die Sie haben zugeteilt Ihr
vector<>
auf den stack. Als solche, die vector-Destruktor wird aufgerufen, wenn es den Bereich verlässt. Ich weiß nicht, was-Leck-Detektor, die Sie verwenden, aber wenn es Dichtheitsprüfungen nur vor der main-Ausgängen kann es zwar erkennen, ein Leck, aber es ist nicht wirklich ein Leck.Wo man in Probleme mit memory leaks ist, dass die
std::vector
Destruktor nicht nennendelete
auf die Elemente im Vektor, wenn es ruft die Destruktoren. Sovector<int>
undvector<MyClass>
sind in Ordnung, da der Vektor enthält das eigentliche Objekt und rufen Sie den Destruktor. Auf der anderen Seite, wenn Sievector<MyClass*>
Sie müssen vorsichtig sein; löschen der Vektor nicht kostenlos die Erinnerung im Zusammenhang mit derMyClass
Objekte, zu denen es Punkte.InformationsquelleAutor Oliver Dain