auto_ptr question
-
Hallo,
Hat der auto_ptr im inneren eine Art Referenzcounter mit dem er die Anzahl der Referenzierenden auto_ptr auf das Objekt zählt? Es doch so, dass der Speicherbereich erst dann freigegeben wird, wenn der letzte auto_ptr der auf das Objekt zeigt destruiert wurde oder?
Danke!
-
auto_ptr ist imho nicht kopierbar.
Dafür müsstest du boost::shared_pointer nehmen.Devil
-
Was sagst du dann zu folgendem was ich gerade ausgetestet habe
#include <iostream> #include <memory> class Show { public: Show() { std::cout<<"constructor"<<std::endl; } virtual ~Show() { std::cout<<"destructor"<<std::endl; } }; int main(int argc, char **argv) { std::auto_ptr<Show> outer; std::cout<<"begin innner"<<std::endl; { std::auto_ptr<Show> inner(new Show()); outer=inner; } std::cout<<"end innner"<<std::endl; return 0; }
Und der Output ist folgendermassen:
begin innner
constructor
end inner
destructor
Press any key to continueAlso kann man ihn schon Kopieren, den Pointer oder?
Thanks
-
Hm, hab selber mal rumgespielt, scheint zu funktionieren.
Man lernt immer mal was dazuDevil
-
Da steht doch outer=innner !!!
Und da inner doch bei dem schließendem } destruiert werden müsste nach eurer *geht nicht kopier* glauben müsste der destructor des Objekts doch vor dem String "end inner" ausgegeben werden, was es auch macht wenn ich den Pointer mit outer=inner nicht kopieren würde.
-
auto_ptr ist weder unkopierbar, noch hat er einen Referenzzähler (für ersteres ist boost::scoped_ptr, für letzteres boost::shared_ptr zuständig). auto_ptr hat eine Besitzübertragungssemantik. Das heißt, es gibt immer genau einen auto_ptr, der einen Zeiger besitzt, d.h. dafür zuständig ist, ihn zu löschen.
Bei einer Kopie oder Zuweisung wird der Besitz übertragen. Die Kopie bzw. das Ziel der Zuweisung bekommt jetzt den Zeiger und die Lösch-Verantwortung, der Zeiger des Originals wird auf 0 gesetzt.
Geht ein auto_ptr, der gerade einen Zeiger managet, aus dem Scope, so wird auf seinen verwalteten Zeiger delete aufgerufen.
-
Ich habe da vielleicht noch ein anschaulicheres Beispiel:
#include <iostream> #include <memory> class Show { public: Show() { std::cout<<"constructor"<<std::endl; } virtual ~Show() { std::cout<<"destructor"<<std::endl; } }; int main(int argc, char **argv) { std::auto_ptr<Show> p1(new Show()); std::auto_ptr<Show> p2; p2=p1; std::cout<<"vor reset"<<std::endl; p1.reset(); std::cout<<"nach reset"<<std::endl; return 0; }
Der Destructor wird hier erst aufgerufen, wenn auch p2 nicht mehr darauf zeigt, auch wenn ich p1 schon resettet habe.
-
...
-
Danke, ich habs verstanden.
Immer der dem der Pointer als letztes zugewiesen wurde ist dafür verantwortlich.Thanks
-
-