AllocateStructureMemory
Verfasst: 07.07.2009 16:03
Hi,
Bei Verwendung von Strings in Stukturen führt bei FreeMemory in der Regel zu Speicherlecks da ja nur der Pointer zu den Strings gelöscht werden.
Hier zwei Beispiele wie man das vermeiden kann. Die erste verwendet interen PB Funktionen (nur X86) wo immer mindestens ein String in der Strukure vorhanden sein muss und wo auf kleinschreibung geachtet werden muss.
Die Zweite verwendet einfach die LinkedList Funktionen wo das freigeben der Strings automatisch erledigt wird. Muss aber EndStructure ersetzt werden.
Code1
Code2 (Update)
FF 
Bei Verwendung von Strings in Stukturen führt bei FreeMemory in der Regel zu Speicherlecks da ja nur der Pointer zu den Strings gelöscht werden.
Hier zwei Beispiele wie man das vermeiden kann. Die erste verwendet interen PB Funktionen (nur X86) wo immer mindestens ein String in der Strukure vorhanden sein muss und wo auf kleinschreibung geachtet werden muss.
Die Zweite verwendet einfach die LinkedList Funktionen wo das freigeben der Strings automatisch erledigt wird. Muss aber EndStructure ersetzt werden.
Code1
Code: Alles auswählen
Macro AllocateStructureMemory(StructName)
AllocateMemory(SizeOf(StructName))
CompilerIf Defined(___Dummy#StructName, #PB_Procedure) = #False
Procedure ___Dummy#StructName()
Protected temp.StructName ; Anlegen der Struktureliste erzwingen
EndProcedure
CompilerEndIf
EndMacro
Macro FreeStructureMemory(PointerToStructure,StructName)
!PUSH dword s_#StructName
!PUSH [p_#PointerToStructure]
!CALL _SYS_FreeStructureStrings@8
;!PUSH [p_#PointerToStructure]
;!CALL _PB_FreeMemory@4
FreeMemory(*PointerToStructure)
EndMacro
Structure udtData
value1.l
value2.l
text.s ; Es muss mindestens ein String vorhanden sein
EndStructure
Debug "Erste Anforderung"
*mem.udtData = AllocateStructureMemory(udtData)
Debug "Datenspeicher: " + Str(*mem)
*mem\text = "Hallo Welt"
Debug "Stringspeicher: " + Str(@*mem\text)
FreeStructureMemory(mem, udtdata) ; Ohne Sternchen und Strukturname klein schreiben
Debug "-----------------"
Debug "Zweite Anforderung"
*mem.udtData = AllocateStructureMemory(udtData)
Debug "Datenspeicher: " + Str(*mem)
*mem\text = "Hallo Welt"
Debug "Stringspeicher: " + Str(@*mem\text)
FreeStructureMemory(mem, udtdata) ; Ohne Sternchen und Strukturname klein schreiben
Debug "-----------------"
Code: Alles auswählen
Macro EndStruct(StructureName)
EndStructure : Global NewList __List#StructureName.StructureName()
EndMacro
Macro AllocateStructureMemory(StructureName)
AddElement(__List#StructureName())
EndMacro
Macro FreeStructureMemory(Memory, StructureName)
If Memory : ChangeCurrentElement(__List#StructureName(), Memory) : DeleteElement(__List#StructureName()) : Memory = 0 : EndIf
EndMacro
Structure udtData
value1.l
value2.l
text.s
EndStruct(udtData)
Debug "Erste Anforderung"
*mem.udtData = AllocateStructureMemory(udtData)
Debug "Datenspeicher: " + Str(*mem)
*mem\text = "Hallo Welt"
Debug "Stringspeicher: " + Str(@*mem\text)
FreeStructureMemory(*mem, udtdata)
Debug "-----------------"
Debug "Zweite Anforderung"
*mem.udtData = AllocateStructureMemory(udtData)
Debug "Datenspeicher: " + Str(*mem)
*mem\text = "Hallo Welt"
Debug "Stringspeicher: " + Str(@*mem\text)
FreeStructureMemory(*mem, udtdata)
Debug "-----------------"
