FreeMem()

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

FreeMem()

Beitrag von Eclipticon »

Guten "Morgen",

wieder mal eine ganz basale Frage:

Code: Alles auswählen

try
  // Irgendwo hier wird eine Exception ausgeloest
  GetMem(SomeThing, SomeSize);
finally
  FreeMem(SomeThing);
end;
Die Ausfuehrung von FreeMem erzeugt einen SIGSEGV. Wie kann ich ueberpruefen, ob SomeThing ueberhaupt Speicher zugewiesen wurde? Macht es Sinn, SomeThing mit nil zu initialisieren und dann mit Assigned() zu pruefen?

Mir ist auch aufgefallen, dass New/Dispose oft der Vorzug ueber GetMem/FreeMem gegeben wird ... wieso das?

Vielen Dank und schoenes Wochenende!

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: FreeMem()

Beitrag von theo »

Eclipticon hat geschrieben: Macht es Sinn, SomeThing mit nil zu initialisieren und dann mit Assigned() zu pruefen?
Ja. (Oder SomeThing<>nil)

http://free-pascal-general.1045716.n5.n ... 25058.html" onclick="window.open(this.href);return false;

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: FreeMem()

Beitrag von Eclipticon »

theo hat geschrieben:
Eclipticon hat geschrieben: Macht es Sinn, SomeThing mit nil zu initialisieren und dann mit Assigned() zu pruefen?
Ja. (Oder SomeThing<>nil)
Danke!
theo hat geschrieben:http://free-pascal-general.1045716.n5.nabble.com/New-Dispose-vs-GetMem-FreeMem-td2825058.html
Wenn ich das richtig verstehe, kann ich mit New() aber keine Speicherbereiche beliebiger Groesse (wie ich sie zB fuer die Ergebnisrueckgabe von RegQueryValueEx brauche) reservieren. (Ja, mir ist TRegistry bekannt, die leistet nur nicht, was ich brauche ;-) )

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: FreeMem()

Beitrag von Socke »

Mit New() und Dispose() sollten immer bekannte Strukturen (Records, Arrays?) verwaltet werden. Wenn du einfach nur X Bytes brauchst, dann verwendest du GetMem() und initialisierst ihn wenn nötig mit FillBytes().
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten