Baumdesign (Split aus Nullpointerthread)


  • Mod

    Kellerautomat schrieb:

    Zu jeder Zeit hat ein Auto genau *einen* Besitzer. Der Besitzer ist aber nicht fuer die Lebenszeit des Autos der selbe. Ebenso faehrt keine der beteiligten Personen dasselbe Auto ihr Leben lang.

    Das Auto zerstört sich aber nicht mit, wenn der Besitzer stirbt. Das ist es aber, was Besitz/unique_ptr ausdrückt! Wenn du jedes Mal den Besitzer änderst, aber niemals die eigentliche Funktion des unique_ptr benutzt, wo ist dann der Unterschied zu einem Pointer?!



  • Wenn der Besitzer stirbt, geht das Auto an Verwandte.

    Nur weil ich einen unique_ptr p auf ein Foo f habe, heisst das noch lange nicht, dass p auch f zerstoert. p kann genauso Besitz an unique_ptr q (std::move) uebergeben.


  • Mod

    Kellerautomat schrieb:

    Nur weil ich einen unique_ptr p auf ein Foo f habe, heisst das noch lange nicht, dass p auch f zerstoert. p kann genauso Besitz an unique_ptr q (std::move) uebergeben.

    Ja, kann. Aber nochmal die Frage: Wenn du jedes Mal den Besitzer änderst, aber niemals die eigentliche Funktion des unique_ptr benutzt, wo ist dann der Unterschied zu einem Pointer?
    Wo ist hier der Besitz? Der Parent zeigt bloß auf seine Kinder. Besitz impliziert irgendeine Art von Verantwortung. Welche Art von Verantwortung siehst du hier? Das Child lebt ganz für sich alleine.



  • Der unique_ptr drueckt Verantwortung fuer ein Objekt aus. Verantwortung kann man delegieren. Delegiert man nicht, ist man selbst verantwortlich. Wo liegt das Problem?


  • Mod

    Kellerautomat schrieb:

    Der unique_ptr drueckt Verantwortung fuer ein Objekt aus. Verantwortung kann man delegieren. Delegiert man nicht, ist man selbst verantwortlich. Wo liegt das Problem?

    Du delegierst eine Verantwortung, die in nichts besteht.



  • Vergleiche hinken eben.


  • Mod

    Kellerautomat schrieb:

    Vergleiche hinken eben.

    Aber dann sag doch einfach mal, was der unique_ptr tut! Alles was du damit machst, ist, ihn andauernd umzubiegen. Du weißt schon: Wie ein normaler Pointer.



  • Ich spar mir den Dtor fuer den Baum.



  • SeppJ schrieb:

    Aber dann sag doch einfach mal, was der unique_ptr tut! Alles was du damit machst, ist, ihn andauernd umzubiegen. Du weißt schon: Wie ein normaler Pointer.

    Mit unique_ptr hast du RAII und damit Exceptionsicherheit zu jeder Zeit. Im Weiteren hast du die Garantie, dass nur ein einzelner Smart-Pointer den Knoten besitzt, du kannst also das Aufräumen nicht vergessen oder aus Versehen mehrfach ausführen.

    Und damit muss man sich keine Gedanken um Destruktor und Kopierkonstruktor/-zuweisungsoperator machen. Die Node ist also nur movable -- eine weitere Fehlerquelle beseitigt.

    Code wird als Folge davon auch kürzer.

    <💡>



  • Kellerautomat schrieb:

    Ich spar mir den Dtor fuer den Baum.

    Hmm.

    void Node::rdestroy()
    {
        if(left) left.rdestroy();
        if(right) right.rdestroy();
        delete this;
    }
    
    Baum::~Baum()
    {
        if(root) root.rdestroy();
    }
    

    Da ist weniger Aufwand als das permanente Tippen von std::move() - ich als sehr ätzend empfinde.



  • Normalerweise ist kein Pointer in meinen Quadtrees besitzend. Alle Knoten sitzen linear aufgereiht in einem extra Container.


Anmelden zum Antworten