Wie Vektoren wirklich gelöscht werden

8

Ich bin ziemlich neu in der C ++ Speicherverwaltung, denn im Gegensatz zu C gibt es mehr Hürden, um den gesamten Speicher freizugeben.

Ich versuche, einen Zeiger auf Vektor eines beliebigen Typs (d. h. vector * data) erfolgreich zu löschen

%Vor%

Allerdings bekomme ich nach der Verwendung von valgrind ein Speicherleck

%Vor%

Wie kann ich alle Spuren von Speicherlecks mit Zeiger auf Vektor (d. h. zur Laufzeit) loswerden?

    
JBRPG 15.04.2013, 02:28
quelle

4 Antworten

22

Für den Anfang glaube ich nicht, dass es ein Leck gibt. Hast du die Leak Summary , die du für das Programm gepostet hast, richtig gelesen?:

%Vor%

Sie haben 0 Bytes in 0 Blöcken verloren. valgrind kann keine eindeutigen, indirekten oder möglichen Lecks finden. Dein Programm ist in Ordnung.

Nebenbei: Sie sollten ... wirklich nicht new oder delete in dieser Situation mit diesem Vektor verwenden. C ++, genau wie C, hat Dinge, die in den Stapel gelangen und außerhalb des Bereichs liegen, wenn Sie sie als reguläre Variablen deklarieren. Der folgende Code erreicht genau das, was Sie in Ihrer Frage getan haben, ohne die Verwendung von new und delete:

%Vor%

Der Stapel wird sich magisch aufräumen, weil std :: vector einen Destruktor hat, der seine Ressourcen aufräumt, wenn er den Gültigkeitsbereich verlässt. Sie müssen es nicht dynamisch machen und es auf den Heap / Free-Speicherbereich des Programmspeichers setzen, wenn der Stack es gut macht.

Es klingt auch so, als käme man von C, also nehme ich mir die Zeit zu sagen: Willkommen in C ++. : D

    
user1357649 15.04.2013, 02:43
quelle
6

Ich denke, das kann die Antwort sein. Was C ++ betrifft, gibt es hier kein Leck.

    
stardust 15.04.2013 02:41
quelle
3

Der ganze Zweck dieser Container-Klassen besteht in der Speicherverwaltung für Sie, Zuweisung, Neuzuweisung und Freigabe. Sie legen den Container auf den Stapel, er behält seinen Inhalt intern dynamisch zugewiesen und wenn die Containerinstanz gelöscht wird, löscht es automatisch die dynamisch zugeordneten Daten.

Die dynamische Instantiierung des Containers selbst macht den Zweck zunichte und ist fast immer sinnlos.

Und ja, in Ihrem Fall wird der Vektor wirklich gelöscht.

    
dtech 15.04.2013 02:45
quelle
-3

Ich denke, du musst

anrufen %Vor%

vor dem Löschen

    
Ryan Santos 15.04.2013 02:47
quelle