Seite 1 von 1

Speicherleck mit String vermeiden (FreeMemory)

Verfasst: 11.06.2006 12:28
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:

Verfasst: 14.06.2006 00:26
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

Verfasst: 14.06.2006 00:33
von mk-soft
@Toshy,

habe ich schon. Aber die Beispiele laufen nicht unter PB4

FF :|

Verfasst: 14.06.2006 08:29
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 

Verfasst: 14.06.2006 15:23
von mk-soft
Danke, Super :allright:

So habe ich mir das gewünscht.

FF :wink: