Besitz kopierender Smartpointer.



  • In letzter Zeit habe ich mich ein wenig in Smart Pointer eingelesen (vor allem Boost). Die wichtigen verhalten sich ja folgendermassen bezüglich Kopien und Zuweisungen:

    • auto_ptr Überträgt (verschiebt) Besitz auf neuen Smart Pointer.
    • shared_ptr Teilt den Besitz unter den einzelnen Smart Pointers.
    • scoped_ptr Beansprucht Besitz für sich allein (verbietet Kopien).

    Nun habe ich mir überlegt, dass das möglicherweise nicht immer reicht. Wenn man nämlich eine Klasse hat, die Zeiger auf Objekte speichert, will man vielleicht auch, dass die verwiesenen Objekte bei einer Kopie der Klasse ebenfalls kopiert werden. Das ist bei allen drei oben genannten Smart Pointers nicht der Fall.

    Aus diesem Anlass habe ich mir ein eigenes Klassentemplate geschrieben, das bei Aufrufen des Kopierkonstruktors oder Zuweisungsoperators jeweils ein neues Objekt anlegt. Der Vorteil besteht für mich darin, dass man bei Klassen mit Zeigern nicht jedes Mal Kopierkonstruktor und Zuweisungsoperator selber implementieren muss. Gegenüber reinen Objekten besteht das Privileg, dass der Typ bei der Deklaration des Smart Pointers noch nicht bekannt sein muss.

    Nun möchte ich euch um Rat fragen: Könnte sich diese Vorgehensweise bewähren? Gibt es bereits Ähnliches, wenn ja, wo?



  • Nennt sich COW (Copy on Write).

    http://de.wikipedia.org/wiki/Copy-On-Write



  • drakon schrieb:

    Nennt sich COW (Copy on Write).

    Ich glaube, du hast mich falsch verstanden. Bei COW geht es darum, überflüssige Kopien zu vermeiden. Mein Smart Pointer hat wenig mit Performance-Optimierung zu tun, sondern soll die Kopiersemantik von Klassen mit Zeigermembern vereinfachen.



  • was willst du?





  • Don06 schrieb:

    Vor zwei Monaten hatte ich diesselbe Idee 😉

    Das ist wirklich interessant. Bei deinem Thread hatte ich noch geantwortet, aber ich konnte mich nicht mehr an deinen Smart Pointer erinnern. Genau die folgende Frage beschäftigte mich auch und liess mich am Sinn zweifeln:

    Don06 schrieb:

    Wenn so etwas sinnvoll wäre, wäre es doch schon längst in Bibliotheken wie boost zu finden, oder habe ich es einfach übersehen?

    Genauso wie die Lösung mit sizeof im Destruktor (hustbaers Post); da bin ich auch vorher durch kurzes Überlegen drauf gekommen. Hm, Zufälle gibts... 😉
    Bei mir heisst die Klasse übrigens object_ptr , weil sie sich fast wie ein Objekt verhält, aber die Nachteile (vollständig bekannter Typ bei Deklaration) schön ausbügelt.

    Gründen wir doch einen Verein, um solche Smart Pointers zu verfechten. 😃



  • Nexus schrieb:

    Don06 schrieb:

    Vor zwei Monaten hatte ich diesselbe Idee 😉

    Das ist wirklich interessant. Bei deinem Thread hatte ich noch geantwortet, aber ich konnte mich nicht mehr an deinen Smart Pointer erinnern.

    du bist schon ein freak 😃


Anmelden zum Antworten