Zu 1.
Im prinzip gar nicht. Deine Programmlogik muss sicher stellen, das dieser auf
nur gültigen Speicherbereich zu greift. Das ist auch der Grund, warum das
arbeiten mit Zeigern so "gefährlich" und nur für Fortgeschrittene ist. Damit
kann man sich viel kaputt machen.
Wenn man aber mit bedacht damit umgehet und weis, was man tut, dann
ist es eine sehr wirksames Werkzeug. Wie du das in deinem Fall am besten machst,
kann ich nicht sagen, es kommt auf deine Programmlogik an, die du erreichen
willst.
Zu 2.
Doch. Gängig ist Obj1\to_Prob = #Null zu setzen und dann vor jedem! Zugriff auf Obj1\to_Prob
diesen auf #Null zu prüfen. Wenn dieser einen anderen Wert als #Null hat, ist der Zugriff
ok. Mit Zugriff meine ich den Aufruf von z.B. Obj1\to_Prob\Name oder anderen Attributen, die
in der Struktur von Probs enthalten sind.
Wenn du allerdings Obj1\to_Prob = #Null setzt, aber anschließend trotzdem Obj1\to_Prob\Name
aufrufst, wird das genau so ein IMA hervorrufen, wie wenn du den Speicherbereich von Prob1
bereits frei gegeben hattest.
Wenn Prob1, aus welchem Grund auch immer, durch etwas anderes ersetzt werden soll,
musst du sicher gehen, das alle Objekte, die Prop1 verwendet haben, ebenffalls dann
mit dem neuen Ersetzt werden. Vergisst du nur eine Zeile, wird das zu einem
IMA führen. Das kann im Übrigen sogar an einer ganz anderen stelle passieren,
als wie wo die fehlende If-Abfrage wäre.
Hm ... hoffe du konntest mir folgen.
Am besten, du stellst dir Bildlich vor, wie die Speicherzugriff aussehen.
Obj1 und Prop1 sind jeweils 2 unterschiedliche Speicherbereiche zugwiesen.
In dem du Obj1\to_Prob = @Prop1 zuweist, wird kein neuer Speicherbereich erstellt.
Es wird beim Aufruf von Obj1\to_Prob\Name tatsächlich nun auf den Speicherbereich
von Prop1 zugegriffen. Existiert Prop1 nicht mehr, ist der Zugriff auf Prop1 und damit
auch auf Obj1\to_Prob\Name ungültig. -> IMA
Das verhindern geht also nur, in dem du schlicht nicht mehr darauf zu greifst.
Dazu sind also unter umständen sehr viele If-Abfragen notwendig. Du brauchst
aber natürlich auch nicht jede Zeile einzeln zu prüfen. Wenn du in einem
Block auf alle Prop1 eigenschaften über Obj1 zugreifst, z.B.
Code: Alles auswählen
Debug Obj1\to_Prop\Name
Debug Obj1\to_Prop\Alter
Debug Obj1\to_Prop\Breite
reicht es, wenn du um den ganzen Block eine If-Abfrage machst.
Code: Alles auswählen
If Obj1\to_Prop
Debug Obj1\to_Prop\Name
Debug Obj1\to_Prop\Alter
Debug Obj1\to_Prop\Breite
Else
Debug "Obj1" hat keine gültigen Eigenschaften!"
EndIf
PS: In PB ist #Null tatsächlich nichts weiter als 0.
MFG PMV