AllocateStructureMemory

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
mk-soft
Beiträge: 3856
Registriert: 24.11.2004 13:12
Wohnort: Germany

AllocateStructureMemory

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3856
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Update Code 2

- Pointer auf Null geprüft
- Pointer wird jetzt nach Freigabe auf Null gesetzt
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Kurzer
Beiträge: 1618
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: AllocateStructureMemory

Beitrag 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.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
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

Beitrag von NicTheQuick »

Ja, es geht nur darum, wenn man selbst mit 'AllocateMemory()' Speicher anfordert, um
dann eine Struktur darin zu speichern.
Benutzeravatar
Kurzer
Beiträge: 1618
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

Ah, pfuhh.. danke. :)
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Antworten