Seite 1 von 1

Speicher in einer Procedure (automatische Freigabe)

Verfasst: 28.04.2013 13:20
von Sunny
Ja...
Also meine Frage besteht eigentlich nur darin, ob ein Speicher, den ich innerhalbe einer Procedure reserviere automatisch freigegeben wird, sobald die Procedure beendet wird?
Ich hab in der Hilfe nichts dazu gefunden.

Re: Speicher in einer Procedure (automatische Freigabe)

Verfasst: 28.04.2013 13:25
von NicTheQuick
Wenn du ihn manuell mit AllocateMemory() allozierst, dann musst du selbst dafür sorgen, dass er wieder freigegeben wird. Alles andere wie lokale Arrays, Listen oder einfache Variablen werden selbst freigegeben.

Re: Speicher in einer Procedure (automatische Freigabe)

Verfasst: 28.04.2013 13:43
von Sunny
OK, in dem Fall habe ich hier mal ein Beispiel:

Code: Alles auswählen

EnableExplicit

Procedure MacheIrgendwas()
  Protected *Buffer
  
  *Buffer = AllocateMemory(1024)
  
  ProcedureReturn *Buffer
EndProcedure

Define *NewBuffer

*NewBuffer = MacheIrgendwas()

Debug MemorySize(*NewBuffer)

FreeMemory(*NewBuffer)
Keine Ahnung, aber da habe ich irgendwie ein kleines Verständnissproblem ^^
Reicht es wie in der letzten Zeile des Beispiels aus, den Speicher *NewBuffer freizugeben?

Ich bin mir nämlich nicht sicher, ob ich mit:

Code: Alles auswählen

*NewBuffer = MacheIrgendwas()
Einen neuen Speicherbereich reserviere und den Inhalt von *Buffer in den neuen Speicher schreibe oder,
ob *Buffer und *NewBuffer ein und der selbe Speicherbereich sind.

Sorry, ich merke schon selber wie dämlich sich das anhört aber irgendwie hab ich da voll die Denkblockade.

Deswegen schonmal danke im voraus für die geduldigen Antworten. ^^

Re: Speicher in einer Procedure (automatische Freigabe)

Verfasst: 28.04.2013 13:48
von ts-soft
Es wäre auch sehr dumm, wenn allokierter Speicher in der Procedure autom. freigegeben würde :mrgreen:
Am Programmende werden alle Speicher autom. freigegeben, so das, wenn man mal einen kleineren
Speicherbereich nicht freigibt, dies vernachlässigbar ist.
Ansonsten immer selbst freigeben, dies muß auch nicht in der speicherallokierenden Procedure geschehen,
sondern in irgendeiner Procedure, die lediglich den Pointer kennen muß.
Notfalls, wenn die Umstände es zu lassen, kann man auch FreeMemory(#PB_All) nutzen. Aber da sollte man
vorsichtig sein, das wirklich keiner der allokierten Speicher noch benötigt wird!

Gruß
Thomas

// ergänzend zu Deiner zwischenzeitlich aufgetauchten Frage:
FreeMemory(*NewBuffer) ist korrekt und gibt den als *Buffer deklarierten Speicher frei.
Die beiden Zeiger sind identisch!

Re: Speicher in einer Procedure (automatische Freigabe)

Verfasst: 28.04.2013 13:52
von Sunny
OK, dann habe ich ja bis jetzt alles richtig gemacht.

Danke für eure Antworten. =)

Re: Speicher in einer Procedure (automatische Freigabe)

Verfasst: 28.04.2013 14:17
von ts-soft
Eine andere Möglichkeit wäre auch den Pointer statisch in der Procedure festzuhalten:

Code: Alles auswählen

EnableExplicit

Procedure MacheIrgendwas(size.i)
  Static *Buffer
  
  If *Buffer <> 0
    FreeMemory(*Buffer)
  EndIf
  *Buffer = AllocateMemory(size)
  
  ProcedureReturn *Buffer
EndProcedure

Define *NewBuffer

*NewBuffer = MacheIrgendwas(1024)

Debug MemorySize(*NewBuffer)

*NewBuffer = MacheIrgendwas(4096)

Debug MemorySize(*NewBuffer)

Dann darf der Speicher aber nicht mehr woanders freigegeben werden!