2010-06-24 10 views
14

in diesem BeispielWird ein dynamisches Array automatisch freigegeben, wenn es den Gültigkeitsbereich verlässt?

procedure foobar; 
var tab:array of integer; 
begin 
    setlength(tab,10); 
end; 

ist die Anordnung zerstört oder der Speicher undicht?

+0

Während es nicht auslaufen kann, sollten Sie wirklich Ihre eigenen Variablen freigeben. Die SetLength (Registerkarte, 0); es ist eine zusätzliche Linie. Wenn Sie sich darum sorgen, wickeln Sie es in einen try/finally Block. –

+2

Ich kann diesen Ratschlag nicht unterstützen, @Ryan. Löschen Sie auch alle Ihre String-Variablen manuell? Wenn ich Code sehe, der Variablen Werte zuweist, die nie wieder benutzt werden, sagt es mir, dass der Programmierer nicht wirklich versteht, wie die Sprache funktioniert. Insbesondere stellt der Compiler bereits einen try-finally-Block um den Funktionskörper herum, um sicherzustellen, dass die Variable dynamic-array bereinigt wird. Ein eigenes Spiel ist zu viel. –

+0

@Ryan, das ist einfach falsch. Der Aufruf von SetLength ist eine totale Verschwendung, sowohl von Tastenanschlägen als auch eines unnötigen Funktionsaufrufs zur Laufzeit. Dynamische Arrays werden vom Compiler verwaltet und automatisch freigegeben, wenn sie den Gültigkeitsbereich verlassen. –

Antwort

14

Der Speicher ist freigegeben. (Das heißt, kein Speicherleck!)

+4

Elemente werden auch freigegeben, wenn diese auch vom Compiler verwaltet werden (Dyn Arrays, Strings, Intf, Datensätze mit solchen Typen usw.). – alex

+1

Für "Registerkarte: Array von Integer" wird alles freigegeben. Für "Registerkarte: Array von TObject" oder eine andere Klasse müssen Sie die Objekte selbst freigeben. –

+0

True, @Warren, aber das hat nichts mit dem Array zu tun. Derselbe Rat gilt für einen gewöhnlichen Skalar. Objekte müssen befreit werden; Ganzzahlen nicht. –

1

Das Array wird automatisch freigegeben, aber ich habe obskure Fälle gesehen, wo es aus irgendeinem Grund nicht ist. Ich habe es gelöst, indem ich das Array auf Null gesetzt habe.

+6

Es gibt nur zwei Gründe, warum es nicht freigegeben würde. Entweder machst du etwas Unheimliches mit Zeigern, das die Referenzzählung durcheinander bringt, oder das Array gehört einem Objekt oder einem Datensatz, der ebenfalls leckt. –

+0

Ich weiß, irgendwie gab es etwas anderes, was dazu führte, dass es nicht automatisch frei wurde. Ich wünschte, ich hätte noch das Beispiel, um es zu beweisen! Aber ich nicht. –

+0

Das wäre ein Fehler im Code-Gen des Compilers. Oder vielleicht war es eine Threadvar? Die Hilfe besagt eindeutig, dass verwalteter Typ, der als threadvars verwendet wird, sich nicht automatisch freigibt, und Sie müssen dies manuell tun. –