Wie werden weak_ptr und enable_shared_from_this implementiert?



  • Hallo zusammen,

    ich habe mir gerade mal etwas zu shared_ptr, weak_ptr und enable_shared_from_this durchgelesen.
    Jetzt frage ich mich allerdings, wie das implementiert wird.
    Einen shared_ptr mit einem use_count zähler sieht nicht allzu schwer zu implementieren aus.
    Aber woher weiß ein weak_ptr, ob das Objekt noch existiert? Dafür müsste es ja eigentlich den use_count überprüfen, aber wenn dieser 0 ist ist der use_count ja bereits zerstört und darf nicht mehr gelesen werden.

    Ich könnte mir vorstellen das mit callbacks zu lösen, aber das wäre ziemlich ineffizient und ich kann mir nicht vorstellen, dass das wirklich so implementiert wird.

    Und dann gibt es noch enable_shared_from_this. Auch da ist es mir ein Rätsel, wie man das implementieren kann. Wenn man nur einen this-pointer hat, woher weiß man dann, wo auf dem heap der use_count liegt (der liegt doch auf dem heap?!)?
    Da könnte ich mir vorstellen, dass enable_shared_from_this einen pointer abspeichert, aber auch dabei kann ich mir nicht wirklich vorstellen, dass das so implementiert wird. Dafür wären vermutlich auch friend-deklarationen nötig.

    Habt ihr eine Ahnung, wie das implementiert wird?



  • Wieso guckst Du Dir nicht einfach den Code an? Das liegt alles als Quelltext vor.



  • Das hab ich schon getan bzw. bin ich noch bei, aber ich finde den code nicht ganz einfach zu verstehn und dachte, dass vielleicht jemand auf anhieb weiß, wie das implementiert wird oder implementiert werden kann.

    Was ich schonmal rausgefunden habe (boost-implementierung):
    - zwischen weak_ptr und shared_ptr gibt es eine friend beziehung
    - sowohl weak_ptr als auch shared_ptr haben als attribut folgendes:

    boost::detail::shared_count pn;
    

    Jetzt versuch ich gerade das hier zu verstehen:
    http://www.boost.org/doc/libs/1_49_0_beta1/boost/smart_ptr/detail/shared_count.hpp



  • Das Heapobjekt zur Referenzzählung wird erst dann gelöscht, wenn sowohl der "Shared Count" als auch der "Weak Count" auf 0 sind. Es ist also nicht einfach nur eine int-Variable auf dem Heap, sondern ein Objekt einer etwas komplexeren Klasse, welche auch die Anzahl der referenzierenden weak_ptr-Objekte kennt.
    Bei enable_shared_from this wird in der Basisklasse (eben enable_shared_from_this) ein weak_ptr gespeichert, welcher beim Zuweisen an den ersten shared_pointer initialisiert wird.
    So ganz grob erklärt.



  • danke!


Log in to reply