Speicher in einer Procedure (automatische Freigabe)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Sunny
Beiträge: 290
Registriert: 19.02.2009 06:02

Speicher in einer Procedure (automatische Freigabe)

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Speicher in einer Procedure (automatische Freigabe)

Beitrag 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.
Benutzeravatar
Sunny
Beiträge: 290
Registriert: 19.02.2009 06:02

Re: Speicher in einer Procedure (automatische Freigabe)

Beitrag 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. ^^
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Speicher in einer Procedure (automatische Freigabe)

Beitrag 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!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Sunny
Beiträge: 290
Registriert: 19.02.2009 06:02

Re: Speicher in einer Procedure (automatische Freigabe)

Beitrag von Sunny »

OK, dann habe ich ja bis jetzt alles richtig gemacht.

Danke für eure Antworten. =)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Speicher in einer Procedure (automatische Freigabe)

Beitrag 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!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten