2010-09-01 12 views
5

Además de todos los beneficios conocidos de usar auto_ptrs, ¿qué son auto_ptr "peores prácticas"?auto_ptr Traps and Pitfalls

  1. Crear contratistas STL de auto_ptrs. auto_ptrs no cumplen el requisito de 'CopyConstructable'. Consulte "STL eficaz" también es Scott Meyer, artículo 8.

  2. Creación auto_ptrs de matrices Por la destrucción, destructor de auto_ptr usos 'Borrar' (y no 'delete []') para destruir el objeto de propiedad, lo que este código rendimientos comportamiento indefinido: auto_ptr api (new int [42]);

  3. No se ocupa de copy-ctor y op = en una clase utilizando miembros auto_ptr. Uno podría ingenuamente pensar que al usar miembros auto_ptr uno no necesita implementar el constructor de copia/operador de asignación para una clase. Sin embargo, incluso un solo miembro auto_ptr 'envenena' una clase (es decir, viola los requisitos 'CopyConstructable' y 'Assignable'). Los objetos de dichas clases se dañarían parcialmente durante la operación de copia/asignación.

¿Hay aún más errores de auto_ptr?

+0

Además, 'auto_ptr' quedará obsoleto en el próximo estándar de C++ (que Sutter espera que sea votado oficialmente después de marzo de 2011 (http://herbsutter.com/2010/08/28/trip-report-august-2010) -iso-c-standards-meeting /), convirtiéndose así en C++ 0B para nosotros recalcitrantes. Si tienes 'unique_ptr', úsalo en su lugar. –

Respuesta

6

No estoy seguro si esto es una trampa/trampa, pero es ciertamente menos obvia:

  • Un auto_ptr const no puede tener su propiedad del puntero contenida transferido

En otras palabras:

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

ap2 = ap; // Not legal! 

Este es de hecho bastante útil si usted quiere tomar un argumento auto_ptr y gu Garantice que no tomará posesión del puntero contenido, pero también puede ser sorprendente si espera que un const auto_ptr<Foo> se comporte como un Foo const*.