AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Speicherfreigabe bei Kürzung eines dynamischen Arrays

Speicherfreigabe bei Kürzung eines dynamischen Arrays

Ein Thema von Gargamel · begonnen am 14. Nov 2011 · letzter Beitrag vom 14. Nov 2011
Antwort Antwort
Gargamel

Registriert seit: 19. Mär 2007
171 Beiträge
 
#1

Speicherfreigabe bei Kürzung eines dynamischen Arrays

  Alt 14. Nov 2011, 10:24
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

Geändert von Gargamel (14. Nov 2011 um 10:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.463 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Speicherfreigabe bei Kürzung eines dynamischen Arrays

  Alt 14. Nov 2011, 10:28
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Gargamel

Registriert seit: 19. Mär 2007
171 Beiträge
 
#3

AW: Speicherfreigabe bei Kürzung eines dynamischen Arrays

  Alt 14. Nov 2011, 10:45
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).
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.463 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Speicherfreigabe bei Kürzung eines dynamischen Arrays

  Alt 14. Nov 2011, 10:47
Ganz genau. Alles, wofür Du Speicher anfordern musst (.Create, GetMem, AllocMem, New) musst Du auch wieder freigeben, wenn Du das Array verkleinerst.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.676 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: Speicherfreigabe bei Kürzung eines dynamischen Arrays

  Alt 14. Nov 2011, 11:21
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Gargamel

Registriert seit: 19. Mär 2007
171 Beiträge
 
#6

AW: Speicherfreigabe bei Kürzung eines dynamischen Arrays

  Alt 14. Nov 2011, 11:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#7

AW: Speicherfreigabe bei Kürzung eines dynamischen Arrays

  Alt 14. Nov 2011, 14:26
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf