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
filekopier- und zuweisbar lassen, was mitscoped_ptrnicht geht. So kann manfile-Objekte in Containern speichern. Für Pimpl scheint mirscoped_ptraber 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 -> WAMMEdit: 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...