Fragen zu boost smart pointern



  • Auf der Seite http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/sp_techniques.html
    bin ich auf ein paar Dinge gestoßen die ich nicht verstehen.

    1. Im 'pimpl idiom' Beispiel: Wo wird da der pointer erstellt? Ich kann nirgentwo ein pimp_(new file::impl) finden. Und ganz grundsätzlich - warum nimmt man hierfür keinen scoped pointer?

    2. Warum soll es nicht möglich sein einen shared_ptr von einem raw pointer zu erstellen? Wenn ich einen shared pointer initialisiere dann übergebe ich ja auch bei "new " einen raw-pointer.

    Matthias



  • pospiech schrieb:

    1. Im 'pimpl idiom' Beispiel: Wo wird da der pointer erstellt? Ich kann nirgentwo ein pimp_(new file::impl) finden. Und ganz grundsätzlich - warum nimmt man hierfür keinen scoped pointer?

    Hier:

    file::file(char const * name, char const * mode): pimpl_(new impl(name, mode))
    

    Natuerlich kann man auch einen scoped_ptr nehmen, der ist meistens sinnvoller. nur in dem Beispiel geht es um Files und ein File ist nicht kopierbar. Deshalb wird shared_ptr verwendet um Kopien erstellen zu koennen (die intern den selben pimpl verwenden). Ob das sinnvoll ist sei dahin gestellt - es ist nur ein Beispiel.

    2. Warum soll es nicht möglich sein einen shared_ptr von einem raw pointer zu erstellen? Wenn ich einen shared pointer initialisiere dann übergebe ich ja auch bei "new " einen raw-pointer.

    Wo steht das denn?

    Bei raw Pointern muss man nur aufpassen, denn der shared_ptr uebernimmt Ownership. dh, der shared_ptr macht irgendwann ein delete auf den Zeiger - wenn man darauf aber achtet gibt es kein Problem.



  • pospiech schrieb:

    1. Im 'pimpl idiom' Beispiel: Wo wird da der pointer erstellt? Ich kann nirgentwo ein pimp_(new file::impl) finden.

    Doch, im Konstruktor:

    file::file(char const * name, char const * mode): pimpl_(new impl(name, mode))
    {
    }
    

    pospiech schrieb:

    Und ganz grundsätzlich - warum nimmt man hierfür keinen scoped pointer?

    Sie wollen file kopier- und zuweisbar lassen, was mit scoped_ptr nicht geht. So kann man file -Objekte in Containern speichern. Für Pimpl scheint mir scoped_ptr aber oft sinnvoller, schliesslich möchte man nicht immer geteilte Besitz-Semantik.

    pospiech schrieb:

    2. Warum soll es nicht möglich sein einen shared_ptr von einem raw pointer zu erstellen?

    Es ist schon möglich, aber mehr als einmal nicht sinnvoll.

    {
        T* raw_ptr = new T();
        shared_ptr<T> smart_ptr1(raw_ptr);
        shared_ptr<T> smart_ptr2(raw_ptr);
    } // Zerstörung von smart_ptr2, delete raw_ptr
      // Zerstörung von smart_ptr1, delete raw_ptr -> WAMM
    

    Edit: Ich war ja wieder mal extrem langsam...



  • pospiech schrieb:

    1. Im 'pimpl idiom' Beispiel: Wo wird da der pointer erstellt? Ich kann nirgentwo ein pimp_(new file::impl) finden. Und ganz grundsätzlich - warum nimmt man hierfür keinen scoped pointer?

    Der Pointer wird in der Initialisierungsliste erstellt:

    file::file(char const * name, char const * mode): pimpl_(new impl(name, mode))
    

    pospiech schrieb:

    2. Warum soll es nicht möglich sein einen shared_ptr von einem raw pointer zu erstellen? Wenn ich einen shared pointer initialisiere dann übergebe ich ja auch bei "new " einen raw-pointer.

    Du meinst http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/sp_techniques.html#from_raw? Weil p bei Beenden der Funktion automatisch freigegeben würde. Das ist aber oft nicht Sinn der Sache.

    EDIT: viel zu spät...


Log in to reply