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.


Anmelden zum Antworten