1. Speicherbereiche, die mit AllocateMemory() reserviert werden, werden meines Wissens nach immer mit dem Wert "0" initialisiert!
Steht jetzt nicht beim Hilfetext von AllocateMemory(), deshalb bitte ich die Koriphäen von PB dieses entsprechend zu bestätigen, oder zu sagen, das ist nicht so!
2. Strings innerhalb von Strukturen werden in der Struktur immer durch einen Pointer auf den String abgebildet.
Code: Alles auswählen
Structure TwoStrings
s1.s
s2.s
EndStructure
Debug(SizeOf(TwoStrings)) ; ... ergibt 8
3. Der Befehl FreeMemory jedoch weiß nicht, wofür der allokierte Speicher verwendet wurde! Deshalb, ist dieser Funktion auch nicht bekannt, dass in diesem Speicherbereich ein (oder mehrere) Pointer auf einen String liegt, wobei der Speicherbereich des Strings außerhalb des Speicherbereichs für die Struktur liegt.
==> Deshalb muss man in diesem Fall immer selbst aufräumen!
==> Macht man das ganze z.B. mit Arrays, dann muss man das nicht aufräumen:
Code: Alles auswählen
#TEST_SIZE = 1024*1024
Structure StructWithStrings
s1.s
x.l
s2.s
EndStructure
MessageRequester("test","Start of Program")
; => 2.500 KByte
Dim test.StructWithStrings(#TEST_SIZE)
MessageRequester("test","Dim test.StructWithStrings("+Str(#TEST_SIZE)+")")
; => 2.524 KByte
For i = 0 To #TEST_SIZE
test(i)\s1 = "test1"
test(i)\s2 = "test2"
Next i
MessageRequester("test","Array filled with Strings")
; => 47.680 ËByte
For i = 0 To #TEST_SIZE
test(i)\s1 = ""
test(i)\s2 = ""
Next i
MessageRequester("test","Strings in Array are cleared with NULL string")
; => 47.680 ËByte
Dim test.StructWithStrings(0)
MessageRequester("test","Array is set to size ZERO!")
; => 2.660 ËByte
@thorsten Friedrichs
Ich hoffe, dass das deine Fragen (wenn ich sie denn richtig verstanden habe) größtenteils beantwortet.
So, das wars für heute,
cu, helpy