Seite 1 von 1
Wie lange bleiben Zeiger bestehen?
Verfasst: 22.03.2021 18:39
von 4Planes
Ich habe mich beim Lesen im Internet über die Verwendung von Pointern selber durcheinandergebracht.
Daher noch mal zur Sicherheit meine Frage: Wie lange bleiben Zeiger bestehen/gültig?
Ich dachte bisher, sie bleiben so lange gültig, wie das Element besteht, auf das sie verweisen, d.h. solange ich eine Variable, eine Struktur oder ein Listenelement nicht ändere, sollte der Zeiger darauf gültig bleiben. Oder kann es sein, dass intern irgendwelche Verschiebungen im Speicher passieren, die dafür sorgen können, dass ein Zeiger nicht mehr richtig funktioniert?
Re: Wie lange bleiben Zeiger bestehen?
Verfasst: 22.03.2021 19:05
von STARGÅTE
Hängt ein bisschen davon ab "woher" dieser Zeiger kommt.
Wenn du mit Element ein Element in einer LinkedList meinst, dann ja, dieser Pointer ist so lange valide bis das Element gelöscht wird.
Pointer zu Memory-Buffern oder Strings bleiben auch solange valide bis sie wieder freigeben werden oder du mit ReAllocateMemory oder durch ändern des Strings die Größe änderst.
Bei Pointer die von DrawingBuffer() u.ä. zurückgegeben werden, sind Zeitlich begrenzt, in dem Fall z.B. bis StopDrawing() aufgerufen wird.
Bei externen Pointer müsstest du in deren Dokumentationen gucken.
Re: Wie lange bleiben Zeiger bestehen?
Verfasst: 22.03.2021 19:11
von mk-soft
Zeiger bleiben so lange gültig, solange das Objekt, Element, Speicher (Allocate- Memory Structure) existiert.
Bei ReAllocateMemory must du den Zeiger neu zuweisen, da sich Adresse im Speicher sich ändern kann.
Wenn du Zeiger auf Elemente verwendest, must du selber prüfen, nach DeleteElement oder DeleteMapElement, ob der Zeiger noch gültig ist .
Re: Wie lange bleiben Zeiger bestehen?
Verfasst: 22.03.2021 19:50
von 4Planes
Vielen Dank für die schnellen Antworten! Dann ist es doch im Wesentlichen so, wie ich ursprünglich dachte.
Wenn du Zeiger auf Elemente verwendest, must du selber prüfen, nach DeleteElement oder DeleteMapElement, ob der Zeiger noch gültig ist .
Aber das ist nur wichtig, wenn ich das Element lösche, auf das der Zeiger verweist, oder? Angenommen ich verweise auf ein Element meiner Liste und lösche ein anderes und füge wieder ein neues hinzu, sollte der Zeiger nach wie vor funktionieren, oder?
Re: Wie lange bleiben Zeiger bestehen?
Verfasst: 22.03.2021 20:11
von mk-soft
Ja, bei Listen und Maps wird nichts verschoben. Es ändern sich nur intern die Zeiger auf das nächste oder vorherige Element.
Code: Alles auswählen
Structure struct_list_header
*NextItem.struct_list_header ;* Pointer to next element in list or zero if at last element
*PrevItem.struct_list_header ;* Pointer to previous element in list or zero if at first element
EndStructure
Structure struct_data
iVal1.i
ival2.i
EndStructure
Structure struct_list_data
Header.struct_list_header
Values.struct_data
EndStructure
Macro GetListFirstItem(_List_)
FirstElement(_List_) - SizeOf(struct_list_header)
EndMacro
Macro GetElement(_List_)
(@_List_ - SizeOf(struct_list_header))
EndMacro
Global NewList MyData.struct_data()
For i = 1 To 5
AddElement(MyData())
Mydata()\iVal1 = 100 + i
Mydata()\iVal2 = 200 + i
Debug "Element = " + @MyData() + " Header = " + Str(@MyData() - SizeOf(struct_list_header))
Next
Debug "----"
*plist.struct_list_data = GetListFirstItem(MyData())
SelectElement(MyData(), 2)
DeleteElement(MyData())
With *plist
Repeat
Debug "PrevItem = " + \Header\PrevItem
Debug "NextItem = " + \Header\NextItem
Debug "Value 1 = " + \Values\iVal1
Debug "Value 2 = " + \Values\iVal2
If \Header\NextItem
*plist = \Header\NextItem
Debug "----"
Else
Break
EndIf
ForEver
EndWith
Re: Wie lange bleiben Zeiger bestehen?
Verfasst: 23.03.2021 12:23
von 4Planes
Vielen Dank!