Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi GetMem / FreeMem - New / Dispose (https://www.delphipraxis.net/168747-getmem-freemem-new-dispose.html)

AJ_Oldendorf 8. Jun 2012 10:10

GetMem / FreeMem - New / Dispose
 
Hallo zusammen,
ich weiß, dass GetMem und FreeMem sowie New und Dispose zusammen gehören.
Mal ne "dumme" Frage, was würde passieren, wenn ich mit New Speicher reserviere und mit FreeMem diesen freigeben würde?

Gruß
Alex

himitsu 8. Jun 2012 10:19

AW: GetMem / FreeMem - New / Dispose
 
Grundsätzlich erstmal nichts, aber New und Dispose beachten die RTTI.

z.B. wenn du einen Record in dem "Pointer hat, welcher z.B. "lange" Strings enthält, dann würde Dispose diesen String freigeben, während FreeMem das nicht macht.

Also besser immer nur die zusammengehörigen Funktionen zusammen benutzen.




New = GetMem + Initialize/InitializeRecord
Dispose = Finallize/FinallizeRecord + FreeMem

Tipp: Schau doch einfach mal in deine System.pas rein. :zwinker:

AJ_Oldendorf 8. Jun 2012 10:27

AW: GetMem / FreeMem - New / Dispose
 
Ok danke.

Das heißt, wenn ich folgenden Record habe, würde FreeMem den String nicht richtig freigeben?

Delphi-Quellcode:
TData   = packed record
    a: LongWord;                  
    b: String[40];            
    c: TDateTime;                
  end;
Gruß
Alex

Luckie 8. Jun 2012 10:29

AW: GetMem / FreeMem - New / Dispose
 
Wo ist da der LANGE String?

himitsu 8. Jun 2012 10:31

AW: GetMem / FreeMem - New / Dispose
 
Nein, den würde es freigeben.
DAS ist ein "kurzer" String. :angle2:

String[123] = Delphi-Referenz durchsuchenShortString mit besimmter maximaler Länge ( MaxLen <= 255 )
String = Delphi-Referenz durchsuchenAnsiString, bzw. Delphi-Referenz durchsuchenUnicodeString, was beides Long-Strings sind.
WideString = WideString, was ein OLE-Wrapper um MSDN-Library durchsuchenSysAllocStringLen und seine Freunde

AJ_Oldendorf 8. Jun 2012 10:55

AW: GetMem / FreeMem - New / Dispose
 
Ok, wusste nicht genau, was du mit "lange" Strings meinst :-)

Also würde bei New und FreeMem (mit richtiger Größenangabe) eigentlich nichts passieren bei dem geposteten Record?

Gruß
Alex

p80286 8. Jun 2012 11:00

AW: GetMem / FreeMem - New / Dispose
 
Ich würde es etwas anders formulieren:

Benutze nur New/Dispose, es sei denn es ist nicht zu umgehen und Du weißt was Du tust, dann benutze Getmem/Freemem.

Die andere Ausnahme ist, wenn Du Wert auf vollkommen unerklärlich Fehler legst, da ist Getmem/Freemem wunderbar für geeignet.

Gruß
K-H

himitsu 8. Jun 2012 11:50

AW: GetMem / FreeMem - New / Dispose
 
Jupp.

FreeMem neigt eventuell zu Speicherlecks, da ja nur der Pointer selber freigegeben wird, aber nichts, was darin eventuell verlinkt wurde.
Und auf GetMem folgen eventuell unerklärliche gemeine und eigentlich erklärliche Fehler, wenn gewisse Dinge nicht ordnungsgemäß initialisiert wurden.

AJ_Oldendorf 8. Jun 2012 11:51

AW: GetMem / FreeMem - New / Dispose
 
Zitat:

Die andere Ausnahme ist, wenn Du Wert auf vollkommen unerklärlich Fehler legst, da ist Getmem/Freemem wunderbar für geeignet
Jetzt würde mich aber wirklich mal interessieren, was du mit unerklärlichen Fehlern meinst wenn man GetMem und FreeMem benutzt?

Gruß
Alex

himitsu 8. Jun 2012 11:56

AW: GetMem / FreeMem - New / Dispose
 
"lange" Stringvariablen, Interfaces, Variants und dynamische Arrays müssen initialisiert sein, sonst knallt die automatische Speicherverwaltung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:42 Uhr.
Seite 1 von 2  1 2      

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