Seite 1 von 1

CopyStructure - Ziel löschen oder nicht?

Verfasst: 25.06.2014 10:22
von Lebostein
Irgendwie ist die Hilfe widersprüchlich:

1. "Die Ziel-Struktur [wird?] vor dem Kopieren automatisch gelöscht - es ist nicht nötig, ClearStructure vor CopyStructure aufzurufen"
2. "Warnung: Das Ziel sollte ein gültiger Struktur-Speicherbereich oder ein gelöschter Speicherbereich sein. Wenn der Speicherbereich nicht geleert ist, kann es zu einem Absturz kommen, da von der Lösch-Routine zufällige Werte genutzt werden."

Re: CopyStructure - Ziel löschen oder nicht?

Verfasst: 25.06.2014 10:58
von NicTheQuick
Nein, es stimmt schon. Es ist nur schwer zu verstehen, was damit gemeint ist. Vielleicht hilft dir das folgende Beispiel. Kommentare inliegend.

Code: Alles auswählen

Structure MyStructure
	List MyList.i()
EndStructure

; Wir erstellen einen genullten Speicherbereich für unsere Struktur.
; Damit ist der Speicherbereich schon mal "gültig" und "geleert" um
; es mit den Worten aus der Hilfe auszudrücken.
Define *a.MyStructure = AllocateStructure(MyStructure)

; Wir können hier so oft 'ClearStructure()' aufrufen wie wir wollen,
; da der Speicherbereich bereits genullt ist und somit kein Pointer 
; verfolgt werden kann, der auf eine LinkedList zeigen könnte
ClearStructure(*a, MyStructure)
ClearStructure(*a, MyStructure)
ClearStructure(*a, MyStructure)
ClearStructure(*a, MyStructure)

; Wenn wir die Struktur korrekt initialisieren, wird ein gültiger
; Pointer zur darin enthaltenen LinkedList erstellt.
InitializeStructure(*a, MyStructure)
Debug "Der Pointer zur LinkedList: " + StrU(PeekI(*a), #PB_Integer)

; Danach können wir sie wieder beliebig oft freigeben mit
; 'ClearStructure()'. Tatsächlich gibt aber nur das erste die
; LinkedList wieder frei. Alle anderen tun nichts.
ClearStructure(*a, MyStructure)
ClearStructure(*a, MyStructure)
ClearStructure(*a, MyStructure)
ClearStructure(*a, MyStructure)
Debug "Der Pointer nach ClearStructure: " + StrU(PeekI(*a), #PB_Integer)

; Jetzt machen wir den Speicherbereich gültig, aber nicht "leer",
; indem wir zufällige Daten rein schreiben.
RandomData(*a, SizeOf(MyStructure))
Debug "Der ungültige Pointer zur vermeintlichen LinkedList: " + StrU(PeekI(*a), #PB_Integer)

; Wenn wir jetzt 'ClearStructure()' aufrufen, versucht die Routine
; dem höchstwahrscheinlich ungültigen Pointer zur LinkedList zu
; folgen um sie zu löschen. Das wird fehlschlagen.
ClearStructure(*a, MyStructure)