Speicherleck mit String vermeiden (FreeMemory)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Speicherleck mit String vermeiden (FreeMemory)

Beitrag von mk-soft »

Hallo Miteinander,

Bastel gerade mit eigenden Objekten rum und hatte das Problem mit Speicherlecks mit Strings bei FreeMemory von den Objekt.

Bin noch nicht ganz ASM Fest, aber habe folgendes hinbekommen.

Code: Alles auswählen

Structure udtTest
  val.l
  text.s
EndStructure

Procedure StringFree(*Adr)
  !extrn _SYS_FreeString@4
  !PUSH   dword [p.p_Adr]
  !CALL  _SYS_FreeString@4
EndProcedure
; Speicherleck
For i = 1 To 5
  *b.udtTest = AllocateMemory(SizeOf(udtTest))
  *b\text = "Hallo" + Space(1000)
  Debug @*b\text
  ;StringFree(@*b\text)
  FreeMemory(*b)
Next
; Ok
For i = 1 To 5
  *b.udtTest = AllocateMemory(SizeOf(udtTest))
  *b\text = "Hallo" + Space(1000)
  Debug @*b\text
  StringFree(@*b\text)
  FreeMemory(*b)
Next
Edit:
Um bei grossen Strukturen den Stringspeicher freizugeben gibt es noch

Code: Alles auswählen

!CALL   SYS_FreeStringStructuredArray
oder !CALL  _SYS_FreeStructureStrings@8
Habe ich aber nicht hinbekommen.

Wäre schön wenn man "FreeMemory(*b.udtTest)" schreiben könnte!

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Hi.
Schau dir mal die paar Seiten unter
http://www.purebasic.fr/german/viewtopi ... gs&start=0
an, da sollte ein Beispiel zu finden sein.

Gruß
Toshy
1. Win10
PB6.1
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

@Toshy,

habe ich schon. Aber die Beispiele laufen nicht unter PB4

FF :|
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag von helpy »

Das funktioniert bei mir:

Code: Alles auswählen

Macro SYS_FreeStructure(PointerToStructure,StructName)
  !PUSH   dword s_#StructName
  !PUSH   [PointerToStructure]
  !CALL  _SYS_FreeStructureStrings@8
EndMacro 

Structure udtTest
  val.l
  text.s
EndStructure

; Without this Structure the offset data table
; "s_udttest" is not created by the compiler!
Procedure dummy()
	Protected temp.udtTest
EndProcedure

Procedure StringFree(*Adr)
  !extrn _SYS_FreeString@4
  !PUSH   dword [p.p_Adr]
  !CALL  _SYS_FreeString@4
EndProcedure

; Speicherleck
For i = 1 To 5
  *b.udtTest = AllocateMemory(SizeOf(udtTest))
  *b\text = "Hallo" + Space(1000)
  Debug @*b\text
  ;StringFree(@*b\text)
  FreeMemory(*b)
Next

; Ok
For i = 1 To 5
  *b.udtTest = AllocateMemory(SizeOf(udtTest))
  *b\text = "Hallo" + Space(1000)
  Debug @*b\text
  StringFree(@*b\text)
  FreeMemory(*b)
Next 

; Ok
For i = 1 To 5
  *b.udtTest = AllocateMemory(SizeOf(udtTest))
  *b\text = "Hallo" + Space(1000)
  Debug @*b\text
  SYS_FreeStructure(p_b,udttest)
  FreeMemory(*b)
Next 
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Danke, Super :allright:

So habe ich mir das gewünscht.

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten