Smartpointer - ein paar Fragen
-
Hallo,
Ich beschäftige mich zur Zeit mit Smartpointern und habe ein kleines Testbeispiel erstellt.#include <iostream> #include <vector> #include <algorithm> #include <memory> #include <ctime> std::tr1::shared_ptr<int> randnum(){ return std::tr1::shared_ptr<int>(new int(rand()%100)); } int main(int argc, char *argv[]){ srand(static_cast<int>(time(NULL))); std::vector<std::tr1::shared_ptr<int> > Numbers(10); std::generate(Numbers.begin(),Numbers.end(),randnum); for(std::vector<std::tr1::shared_ptr<int> >::iterator it=Numbers.begin();it!=Numbers.end();it++){ std::cout<<*(it->get())<<" "<<(it->use_count())<<std::endl; } }Dazu hätte ich ein paar Fragen:
1.) Ich habe gelesen, dass man keine auto_ptr als Member von STL Containern verwenden sollte.
Wie verhält es sich da mit shared_ptr?2.) In meinem Beispiel habe ich eine Funktion die einen shared_ptr zurückgibt.
Dabei wird der shared_ptr einmal kopiert(?) Also gibt es für diesen kurzen Augenblick 2 Referenzen auf die Daten, oder?3.) Bei der Deklaration wird als Template-Argument int angegeben, obwohl eigentlich ein shared_ptr auf new int(), also int* zurückgegeben wird. Wie wäre das dann bei int** ?
Würde mich freuen wenn mir da Jemand helfen könnte.
MfG
-
zhxo84 schrieb:
1.) Ich habe gelesen, dass man keine auto_ptr als Member von STL Containern verwenden sollte.
Wie verhält es sich da mit shared_ptr?Erlaubt.
zhxo84 schrieb:
2.) In meinem Beispiel habe ich eine Funktion die einen shared_ptr zurückgibt.
Dabei wird der shared_ptr einmal kopiert(?) Also gibt es für diesen kurzen Augenblick 2 Referenzen auf die Daten, oder?Ja, wenn der Compiler nicht optimiert.
zhxo84 schrieb:
3.) Bei der Deklaration wird als Template-Argument int angegeben, obwohl eigentlich ein shared_ptr auf new int(), also int* zurückgegeben wird. Wie wäre das dann bei int** ?
Dann gibst du als Argument int* an.
-
314159265358979 schrieb:
Dann gibst du als Argument int* an.
oder du machst einen
shared_ptr<shared_ptr<int> >
wenn du gar keine raw pointer mehr haben möchtest.
-
Vielen Dank für die Antwort.
Ich hätte noch eine abschließende Frage:
Wenn ich Smartpointer in einem std::vector verwenden möchte, sollte ich dann eher den std::tr1::shared_ptr oder den boost shared_ptr verwenden?Hierbei geht es mir nur darum, dass der Speicher der jeweiligen Elemente über die Smartpointer freigegeben wird wenn der vector zerstört (oder mit clear() geleert) wird.
-
tr1::shared_ptr ist boost::shared_ptr. Wenn du allerdings keine geteilten Besitzverhältnisse brauchst und C++0x verwendest, dann nimm std::unique_ptr.
-
Alles klar, danke.
-
@zhxo84:
Wenn du C++0x Features nutzen kannst, dann nimm gleich einen std::unique_ptr.
Oder nimm einen boost::ptr_vector.Ansonsten kannst du den shared_ptr sowohl von TR1 als auch von Boost nehmen, die unterscheiden sich kaum (oder gar nicht?).
----
314159265358979 schrieb:
tr1::shared_ptr ist boost::shared_ptr.
Dass das, so formuliert, nicht richtig ist, weisst du doch selbst, oder?
Sie mögen fast gleich oder sogar exakt gleich definiert sein (äquivalent), aber deswegen sind sie nicht identisch.
-
hustbaer schrieb:
@zhxo84:
Wenn du C++0x Features nutzen kannst, dann nimm gleich einen std::unique_ptr.
Oder nimm einen boost::ptr_vector.Ansonsten kannst du den shared_ptr sowohl von TR1 als auch von Boost nehmen, die unterscheiden sich kaum (oder gar nicht?).
Danke, im Moment verwende ich MSVC2008 - bleibe also auf TR1 beschränkt. Boost habe ich bisher noch nie verwendet, werde es mir aber einmal ansehen.