shared_pointer initalisierung mit NULL



  • Wenn du dem Zeiger etwas zuweisen willst, mach

    shared_ptr<const ro> mpRelOr;
    

    daraus. Du kannst einer Konstante später nichts mehr zuweisen; das ist der Sinn einer Konstante.



  • scheint als ob du mpRelOr folgendermassen definiert hast:

    const shared_ptr<const ro> mpRelOr;
    

    Dann hast du natürlich einen konstanten shared_ptr, und kannst ihm nicht einfach etwas zuweisen. Das sollte aber eigentlich klar sein oder nicht? Du musst mpRelOr bei der Definition auch gleich initialisieren.



  • notsmart schrieb:

    ...

    Hat sich erledigt. Ich bin doof und wollte ein const Objekt beschreiben.



  • Danke nochmal für die Hinweise..



  • Außerdem solltest du (außer es gibt einen sinnvollen Grund) die Smart-Pointer per value übergeben. Die Referenzzählung garantiert, dass der Pointer immer gültig ist, und das geht nur, wenn du die Kopiersemantik nutzt.



  • Jodocus schrieb:

    Außerdem solltest du (außer es gibt einen sinnvollen Grund) die Smart-Pointer per value übergeben. Die Referenzzählung garantiert, dass der Pointer immer gültig ist, und das geht nur, wenn du die Kopiersemantik nutzt.

    Ist das wirklich so?

    Ich meine nämlich das hier vorher gefunden zu haben:

    http://www.c-plusplus.net/forum/174283



  • Jodocus schrieb:

    Außerdem solltest du (außer es gibt einen sinnvollen Grund) die Smart-Pointer per value übergeben. Die Referenzzählung garantiert, dass der Pointer immer gültig ist, und das geht nur, wenn du die Kopiersemantik nutzt.

    Ganz viel AUA!

    shared_ptr bitte niemals nicht by-value übergeben, denn das kostet schnell mal ein paar hundert Cycles (shared_ptr muss seinen Counter threadsafe updaten, und das ist teuer).

    Und was die Referenzzählung angeht, das funktioniert natürlich wunderbar. Referenzen auf shared_ptr als Member abzuspeichern wäre böse. Als Parameter aber bitte immer per reference-to-const.



  • Skym0sh0 schrieb:

    lass den einfach so, der standardkonstruktor belegt den schon mit 0. und selbst wenn nicht, das interessiert dich nicht, da shared_ptr eh fehler wirft wenn du auf einen ungültigen zeiger zugreifen willst...

    Auch ganz viel AUA!

    Der operator -> von shared_ptr ist "unchecked". D.h. der wirft gar nix wenn man einen ungültigen Zeiger dereferenziert, das Programm wird das selbe machen wie bei einem rohen Zeiger.

    § 20.9.11.2.5 schrieb:

    T* operator->() const;

    Requires: get() != 0.
    Returns: get().
    Throws: nothing.



  • Und wie löst man jetzt dass Problem dass man ihn irgendwie NULL referenziert und dann immer wieder abfragt?



  • Erstens referenziert ein Zeiger nicht, er zeigt. Zweitens, indem man ihn nicht 0 zeigern lässt? Wozu sollte man einen shared_ptr wollen, wenn der dann eh auf nichts zeigt?



  • 314159265358979 schrieb:

    Erstens referenziert ein Zeiger nicht, er zeigt.

    Wenn man zwanghaft klugscheißen will, sollte man wenigstens recht haben.



  • notsmart schrieb:

    Und wie löst man jetzt dass Problem dass man ihn irgendwie NULL referenziert und dann immer wieder abfragt?

    So wie man es in sämtlichen Beispielen sieht.


Anmelden zum Antworten