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.
Speicher in einer Procedure (automatische Freigabe)
- 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)
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)
OK, in dem Fall habe ich hier mal ein Beispiel:
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:
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. ^^
Code: Alles auswählen
EnableExplicit
Procedure MacheIrgendwas()
Protected *Buffer
*Buffer = AllocateMemory(1024)
ProcedureReturn *Buffer
EndProcedure
Define *NewBuffer
*NewBuffer = MacheIrgendwas()
Debug MemorySize(*NewBuffer)
FreeMemory(*NewBuffer)
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()
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. ^^
- 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)
Es wäre auch sehr dumm, wenn allokierter Speicher in der Procedure autom. freigegeben würde
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!

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Speicher in einer Procedure (automatische Freigabe)
OK, dann habe ich ja bis jetzt alles richtig gemacht.
Danke für eure Antworten.
Danke für eure Antworten.

- 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)
Eine andere Möglichkeit wäre auch den Pointer statisch in der Procedure festzuhalten:
Dann darf der Speicher aber nicht mehr woanders freigegeben werden!
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)
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
