Bei der Verwendung von SetLength() in Delphi, was ist der richtige Weg freigeben, dass der Speicher?
Ich war kürzlich auf der Suche auf einige code, der verwendet SetLength reservieren von Speicher für ein array von bytes, aber ich sehe keine Logik zur Freigabe von Arbeitsspeicher. Ich habe gelesen, dass man für ein array von bytes, sollten Sie entweder setzen Sie den Wert auf null, oder verwenden Sie Abschließen?
Was ist der beste Weg, dies zu behandeln... Basierend auf dem was ich fand, es schlägt so etwas wie die folgenden...
var
x: array of byte;
begin
SetLength(x, 30);
// Do something here
:
// Release the array
x := nil;
Finalize(x);
end;
InformationsquelleAutor Tim Koscielski | 2012-05-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Normalerweise müssen Sie nicht den Speicher frei, denn dies geschieht automatisch, wenn die Kennung (in diesem Fall
x
) geht out of scope. Folglich, die zwei letzten Zeilen im code sind völlig bedeutungslos.Wenn, jedoch, Sie haben einen Bezeichner, der nicht außerhalb des Bereichs, bis, sagen wir, Ihr Programm zu schließen, dann möchten Sie vielleicht, um den Speicher frei zugeordnet manuell. Insbesondere, möchten Sie vielleicht, dies zu tun, wenn der Bezeichner ein großes bitmap-Bild oder so etwas. Dann könnten Sie tun
x := nil
,SetLength(x, 0)
oder sowas.InformationsquelleAutor Andreas Rejbrand
Dynamische arrays sind verwaltete Typen. Dies bedeutet, dass der compiler entsorgen Sie den Speicher, wenn die Letzte Referenz auf das array außerhalb des Gültigkeitsbereichs. Das bedeutet, dass der code frei das array in deinem code ist eher sinnlos.
Wenn Sie müssen, können Sie freigeben, das array vor der Zeit mit einer der folgenden äquivalenten code-Zeilen:
Hüten Sie sich vor, dass, wenn Sie mehrere Referenzen auf das gleiche array, dann müssen Sie dies für alle Verweise auf das array.
InformationsquelleAutor David Heffernan