2010-09-01 17 views
5

Outre tous les avantages connus de l'utilisation de auto_ptrs, qu'est-ce que auto_ptr "pire des pratiques"?auto_ptr Pièges et pièges

  1. Création de contraints STL de auto_ptrs. Les auto_ptrs ne remplissent pas les conditions 'CopyConstructable'. Voir aussi "STL efficace" de Scott Meyer, point 8.

  2. Création auto_ptrs de tableaux Pour la destruction, les utilisations destructor de auto_ptr 'delete' (et jamais «supprimer []) pour détruire l'objet propriété, de sorte que cela donne de code comportement indéfini: auto_ptr api (new int [42]); Ne prend pas en charge copy-ctor et op = dans une classe utilisant les membres auto_ptr. On pourrait penser naïvement qu'en utilisant les membres auto_ptr, il n'est pas nécessaire d'implémenter le constructeur de copie/l'opérateur d'assignation pour une classe. Cependant, même un seul membre auto_ptr "empoisonne" une classe (c'est-à-dire qu'il viole les conditions "CopyConstructable" et "Assignable"). Les objets de ces classes seraient partiellement endommagés pendant l'opération de copie/affectation.

Y a-t-il encore plus de pièges auto_ptr?

+0

En outre, 'auto_ptr' sera obsolète dans la prochaine norme C++ (qui, selon Sutter, sera officiellement votée après mars 2011 (http://herbsutter.com/2010/08/28/trip-report-august-2010 -iso-c-standards-meeting /), devenant ainsi C++ 0B pour nous die-hards). Si vous avez 'unique_ptr', utilisez-le à la place. –

Répondre

6

Je ne sais pas si cela est un piège/piège, mais il est certainement moins évident:

  • Un const auto_ptr ne peut pas avoir la propriété du pointeur contenu transféré

En d'autres termes:

const auto_ptr<Foo> ap(new Foo()); 
auto_ptr<Foo> ap2; 

ap2 = ap; // Not legal! 

C'est en fait tout à fait utile si vous voulez prendre un argument auto_ptr et gu Assurez-vous que vous ne serez pas propriétaire du pointeur contenu, mais il peut aussi être surprenant si vous vous attendez à ce qu'un const auto_ptr<Foo> se comporte comme un Foo const*.