Pointer auf Objekt. Gültigkeitsprüfung?



  • Hallo Leute.

    Habe mal wieder eine Frage an euch. Kurzes Szenario:
    Es existieren 2 Objekte, die aus unterschiedlichen Klassen instanziiert wurden. Objekt A bekommt über einen Funktionsparameter die Referenz zu Objekt B (Objekt A speichert also einen Pointer zu Objekt B). Fortan sendet Objekt A irgendwelche Daten an Objekt B. Nun wird irgendwann das Objekt B zerstört. Wie kann Objekt A nun prüfen, ob Objekt B noch existiert? Der gespeicherte Pointer ist zwar ungültig, aber nicht NULL.

    Was könnte ich tun, um eine Dereferenzierung auf einen ungültigen Pointer zu vermeiden? Meine einzige Idee ist es, dass Objekt B auch eine Referenz zu Objekt A speichert. Wird Objekt B zerstört, sendet es vorher eine Nachricht an Objekt A. Objekt A kann dann den gespeicherten Pointer auf Objekt B auf NULL setzen. ...aber so richtig toll finde ich es irgendwie nicht. Bietet C++11 da irgend etwas?

    viele Grüße,
    SBond


  • Mod

    Entweder muss sich B bei A abmelden oder es muss eine übergeordnete Stelle C geben, an die A seine Nachrichten schickt und die eine Liste der Empfänger verwaltet. Die genaue technische Umsetzung kann dann auf allerlei Art und Weise erfolgen, erst einmal ist jedoch zu klären, welches Modell das passendste ist.



  • Hui du gehst wohl auch nie schlafen 😃

    Ok, hatte ich mir fast schon gedacht. Schade eigentlich. Naja dann werde ich es per 'Abmeldung' lösen. Danke die vielmals 🙂


  • Mod

    SBond schrieb:

    Hui du gehst wohl auch nie schlafen 😃

    Ich bin den ganzen letzten Monat um 3 schlafen gegangen, teilweise später. Dazu sei aber erwähnt, dass SeppJ in Kalifornien hausiert, demnach war es dort zum Zeitpunkt seines Posts fast Mittags.

    Zum Thema: Es scheint, dass die Komponente, die B zerstört, A entsprechend benachrichtigen sollte. Laut RAII wäre das eigentlich der Destruktor. I.e. ein abmelde-callback wäre angebracht. Hängt aber von dem genauen Modell ab, ob das sinnvoll ist.



  • Achso 😃

    Ja die 'unbind'-Nachricht habe ich im Destruktor von Objekt B hinterlegt. Objekt A prüft bei erhalt der Nachricht, ob der Befehl von dem Objekt kommt, an dem es auch gebunden ist und setzt dann einen nullptr auf den gespeicherten Zeiger.

    funktioniert auch soweit 🙂


Anmelden zum Antworten