boost::shared_ptr et std::auto_ptr

boost::shared_ptr et std::auto_ptr - C++ - Programmation

Marsh Posté le 19-02-2013 à 22:14:31    

bonsoir,
 
Il me semble qu'il est déconseillé d'utiliser des auto_ptr dans les conteneurs de la STL, à cause du transfert "d'ownership".
 

Code :
  1. std::vector< std::auto_ptr<int> > vec; // this is BAD, right ?


 
Est ce de même pour les shared_ptr ? Par exemple :
 

Code :
  1. std::vector< boost::shared_ptr<int> > vec; // this is OK, right ?


 
est-il acceptable ?
 
 
merci

Reply

Marsh Posté le 19-02-2013 à 22:14:31   

Reply

Marsh Posté le 19-02-2013 à 22:36:54    

Bonjour !
 
De mémoire, nous avons dans le cadre d'un projet utilisé intensivement des vector de shared_ptr, sans le moindre souci.
 
Je vous confirme ça demain en regardant dans le code correspondant :)

Reply

Marsh Posté le 20-02-2013 à 10:42:44    

thx !
 
anybody pour une réponse aujourd'hui ? :)

Reply

Marsh Posté le 20-02-2013 à 13:10:10    

in_your_phion a écrit :

thx !
 
anybody pour une réponse aujourd'hui ? :)


 
C'est tout à fait acceptable (je le fait sur mes projets) mais il me semble que ce n'est pas conseillé au niveau des performances (sur mes projets c'est pas franchement visible, faut voir ce qui se fait chez boost, il me semble que c'est sur une de leur lib que j'avais lu ça)
Si JoelF passe dans le coin je pense qu'il te donnera une réponse plus précise sur l'histoire des performances.

Reply

Marsh Posté le 20-02-2013 à 19:45:32    

http://stackoverflow.com/questions [...] shared-ptr
 
Et puis boost auto_ptr est déprécié

Reply

Marsh Posté le 20-02-2013 à 20:37:50    

De souvenir, faut justement pas utiliser les std::auto_ptr. C'est l'équivalent d'un boost::scoped_ptr sauf que dans boost, ils ont eu l'intelligence d'interdire sa copie.
Le std::auto_ptr, si tu en fait une copie et si copie est détruite tu perds ton pointeur. Et le std::auto_ptr qui avait été copié pointe maintenant sur de la mémoire désalouée.
Dc c'est bien naze.
 
Le boost::shared_ptr ajoute un compteur du nombre de copie et libère la mémoire quand la dernière copie est détruite.
 
 
edit: et dc dans ton vector ne surtout pas mettre de std::auto_ptr car au moindre resize du conteur (genre par ex. pour ajouter un nouvel élément) tu as plein de copies qui se font et tu perds du coup tous tes pointeurs...


Message édité par Amonchakai le 20-02-2013 à 20:42:43
Reply

Marsh Posté le 21-02-2013 à 08:18:41    

Je ne peux qu'approuver ce qui est dit sur l'utilisation des "shared_ptr", qui, après vérification, fonctionnent en effet très bien dans des vecteurs.
 
Pour les "auto_ptr", ne les ayant jamais utilisés, je ne peux rien apporter de plus :)
 
Bonne continuation !

Reply

Marsh Posté le 21-02-2013 à 18:55:24    

Par contre, c'est important de bien faire attention à un point : un pointeur utilisé dans un shared_ptr ne doit plus jamais être utilisé nu ...
Vu que l'implémentation n'est pas intrusive, si tu construis séparément deux shared_ptr à partir du même pointeur nu, leurs compteurs de référence seront séparés ...


---------------
last.fm
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed