Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Speicherfreigabe bei Kürzung eines dynamischen Arrays (https://www.delphipraxis.net/164456-speicherfreigabe-bei-kuerzung-eines-dynamischen-arrays.html)

Gargamel 14. Nov 2011 09:24

Speicherfreigabe bei Kürzung eines dynamischen Arrays
 
Hi

Beispiel:

Code:
type

rec_test = record
   name:string;
end;

var list:array of rec_test;

procedure test()
begin
   // Größe des Arrays setzen
   setLength(list,5);
   
   // Array mit Werten füllen
   list[0].name:='Asterix';
   list[1].name:='Obelix';
   list[2].name:='Idefix';
   list[3].name:='Automatix';
   list[4].name:='Miraculix';

   // jetzt testweise die Liste kürzen
   setLength(list,4);
end;
Wird jetzt der Speicherbereich, der durch list[4] verwendet wurde, automatisch wieder freigegeben?

Danke

DeddyH 14. Nov 2011 09:28

AW: Speicherfreigabe bei Kürzung eines dynamischen Arrays
 
In dem Fall ja. Anders verhält es sich, wenn es sich um Pointer oder Objektinstanzen handeln würde, die müsstest Du händisch freigeben.

Gargamel 14. Nov 2011 09:45

AW: Speicherfreigabe bei Kürzung eines dynamischen Arrays
 
Ah, vielen Dank. So eine Antwort hatte ich erhofft. Das mit der Freigabe von Objektinstanzen wußte ich. Mache ich immer mit FreeAndNil(obj).
Und bei der Speicherfreigabe von Zeigern meinst Du bestimmt dispose(irgendeinZeiger).

DeddyH 14. Nov 2011 09:47

AW: Speicherfreigabe bei Kürzung eines dynamischen Arrays
 
Ganz genau. Alles, wofür Du Speicher anfordern musst (.Create, GetMem, AllocMem, New) musst Du auch wieder freigeben, wenn Du das Array verkleinerst.

Medium 14. Nov 2011 10:21

AW: Speicherfreigabe bei Kürzung eines dynamischen Arrays
 
Wobei ggf. noch anzumerken ist, dass der Speicher für das tatsächliche Plätzchen im Array nicht unmittelbar an Windows zurück gegeben wird, sondern der Delphi-MM diesen vorerst einbehält, um ihn später anderweitig ggf. schnell wiederverwenden zu können, ohne ein neues malloc() auszuführen. (Das könnte auch für den vom String belegten Platz gelten.) Daher ist es gut möglich, und kein Fehler, dass man dieses "Freigeben" nicht im Taskmanager sieht, da dein Programm aus Sicht von Windows diesen noch immer belegt. Er ist halt intern nur als frei markiert.

Gargamel 14. Nov 2011 10:24

AW: Speicherfreigabe bei Kürzung eines dynamischen Arrays
 
Das Prinzip kenne ich irgendwoher. Nennt sich das nicht Memory-Shadowing?
Der eigentlich freigegebene Speicher wird von dem Programm nicht an Windows zurückgegeben, weil eine erneute Speicheranforderung durch das OS Zeit kosten würde. Das hatte ich mal im Zusammenhang mit 3D-Engines gelesen.

negaH 14. Nov 2011 13:26

AW: Speicherfreigabe bei Kürzung eines dynamischen Arrays
 
Zitat:

Zitat von Gargamel (Beitrag 1136054)
Das Prinzip kenne ich irgendwoher. Nennt sich das nicht Memory-Shadowing?

Nein, das was du meinst ist das Shadow-Memory. Das ist ein Speicherbereich, meist in einem externen Speicherchip, der nicht direkt durch die CPU angesprochen werden kann weil die CPU selber ihren eigenen internen RAM in diesen Adressbereich einblendet.

Gruß hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz