CopyStructure - Ziel löschen oder nicht?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

CopyStructure - Ziel löschen oder nicht?

Beitrag 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."
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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

Re: CopyStructure - Ziel löschen oder nicht?

Beitrag 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)
Antworten