Seite 1 von 1

AllocateStructureMemory

Verfasst: 07.07.2009 16:03
von mk-soft
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

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 "-----------------"
Code2 (Update)

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 "-----------------"
FF :wink:

Verfasst: 13.07.2009 17:01
von mk-soft
Update Code 2

- Pointer auf Null geprüft
- Pointer wird jetzt nach Freigabe auf Null gesetzt

Re: AllocateStructureMemory

Verfasst: 13.07.2009 23:01
von Kurzer
mk-soft hat geschrieben: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.
Örks, echt? :shock:

Ich hoffe ja, daß Du Dich bei dieser Aussage auf einem niedrigen Programmier-Level befindest (im Sinne von systemnaher Programmierung, wg. ASM usw.).
Also ich meine, daß gilt hoffentlich nur für Strukturen, für die man selbst memory allokiert.

So eine PB-Struktur, in der Strings vorkommen wird doch hoffentlich nach dem Beenden des Programms keine Speicherlecks hinterlassen?
Bin etwas verwirt gerade... weil sich mir der Sinn so eines selbstverwalteten Speicherbereichs für Strukturen innerhalb eines PB-Programms nicht erschließt.

Verfasst: 13.07.2009 23:27
von NicTheQuick
Ja, es geht nur darum, wenn man selbst mit 'AllocateMemory()' Speicher anfordert, um
dann eine Struktur darin zu speichern.

Verfasst: 14.07.2009 00:10
von Kurzer
Ah, pfuhh.. danke. :)