Wie lange bleiben Zeiger bestehen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
4Planes
Beiträge: 37
Registriert: 19.11.2020 17:08

Wie lange bleiben Zeiger bestehen?

Beitrag 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?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wie lange bleiben Zeiger bestehen?

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Wie lange bleiben Zeiger bestehen?

Beitrag 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 .
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
4Planes
Beiträge: 37
Registriert: 19.11.2020 17:08

Re: Wie lange bleiben Zeiger bestehen?

Beitrag 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?
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Wie lange bleiben Zeiger bestehen?

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
4Planes
Beiträge: 37
Registriert: 19.11.2020 17:08

Re: Wie lange bleiben Zeiger bestehen?

Beitrag von 4Planes »

Vielen Dank!
Antworten