http://forums.purebasic.com/german/view ... highlight=
Wer kein AllocateMemory() für Strukturen mit Stringfeldern benutzt, muss
nicht beunruhigt sein. Es geht also um Codes wie der folgende:
Code: Alles auswählen
Structure TestStruc
l.l
s.s
f.f
s2.s
EndStructure
*pElement.TestStruc = AllocateMemory(SizeOf(TestStruc))
*pElement\s = "hallo"
*pElement\s2 = "welt"
FreeMemory(*pElement)
; Hier entsteht ein Speicherleck: \s und \s2 werden NICHT
; von PB automatisch freigegeben! Auch ein Zuweisen eines
; Leerstrings ("") hilft nicht viel.
dem Speicher zu entfernen! Wenn man nun den ASM-Output liest, findet
man jedoch eine Methode

Code: Alles auswählen
Procedure FreeStructuredString1(ptrstruct, offset.l)
Protected p.l
p = AllocateMemory(8)
PokeL(p, offset)
PokeL(p + 4, -1)
!PUSH dword[esp+8] ; Pointer auf 'p'-Bereich
!PUSH dword [esp+4] ; ptrstruct
!CALL _SYS_FreeStructureStrings@8
FreeMemory(p)
EndProcedure
Code: Alles auswählen
Procedure FreeStructuredString2(ptrstruct.l, ptroffsets.l)
!PUSH dword [esp+4] ; offsets der Strings
!PUSH dword [esp+4] ; ptrstruct
!CALL _SYS_FreeStructureStrings@8
EndProcedure
Code: Alles auswählen
Structure TestStruc
l.l
s.s
f.f
s2.s
EndStructure
*pElement.TestStruc = AllocateMemory(SizeOf(TestStruc))
*pElement\s = "hallo"
*pElement\s2 = "welt"
; vor dem FreeMemory() noch die Strings freigeben.
; dazu muss die Funktion für jeden String einzeln aufgerufen
; werden:
FreeStructuredString1(*pElement, OffsetOf(TestStruc\s))
FreeStructuredString1(*pElement, OffsetOf(TestStruc\s2))
; nun sind die Strings nicht mehr benutzbar und nicht
; mehr im Speicher.
FreeMemory(*pElement)
oder doch auch wieder einfacher?
Code: Alles auswählen
Structure TestStruc
l.l
s.s
f.f
s2.s
EndStructure
; Beliebig viele Offsets der Strings mit abschliessendem -1
; muss für jede Struktur gemacht werden!
DataSection
offTestStruc: ; Label zum Zugriff
Data.l OffsetOf(TestStruc\s), OffsetOf(TestStruc\s2), -1
; also etwa so:
; Data.l Offset1, Offset2, -1
; oder wie im Beispiel:
; Data.l 4, 12, -1
; dabei geht auch für grössere Strukturen z. B.
; Data.l Offset1, Offset2, Offset3, Offset4, ... , OffsetN, -1
EndDataSection
*pElement.TestStruc = AllocateMemory(SizeOf(TestStruc))
*pElement\s = "hallo"
*pElement\s2 = "welt"
; vor dem FreeMemory() noch die Strings freigeben.
; dazu muss die Funktion für die Struktur einmal aufgerufen
; werden. Dabei muss neben dem Pointer auf die Struktur, der
; Pointer zu unseren Offsets übergeben werden (?labelname)
FreeStructuredString2(*pElement, ?offTestStruc)
; nun sind die Strings nicht mehr benutzbar und nicht
; mehr im Speicher.
FreeMemory(*pElement)
greetz
Remi