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!