what is a smart pointer c++




¿Por qué es incorrecto usar std:: auto_ptr<> con contenedores estándar? (4)

Dos artículos super excelentes sobre el tema:

¿Por qué es incorrecto usar std::auto_ptr<> con contenedores estándar?


El estándar de C ++ dice que un elemento STL debe ser "copiable construible" y "asignable". En otras palabras, un elemento debe poder asignarse o copiarse y los dos elementos son lógicamente independientes. std::auto_ptr no cumple este requisito.

Tomemos por ejemplo este código:

class X
{
};

std::vector<std::auto_ptr<X> > vecX;
vecX.push_back(new X);

std::auto_ptr<X> pX = vecX[0];  // vecX[0] is assigned NULL.

Para superar esta limitación, debe usar los punteros inteligentes std::unique_ptr , std::shared_ptr o std::weak_ptr o los equivalentes de boost si no tiene C ++ 11. Aquí está la documentación de la biblioteca de impulso para estos punteros inteligentes.


Los contenedores STL almacenan copias de los artículos contenidos. Cuando se copia un auto_ptr, establece el ptr antiguo en nulo. Muchos métodos de contenedor están rotos por este comportamiento.


Los contenedores STL deben poder copiar los artículos que almacena en ellos, y están diseñados para esperar que el original y la copia sean equivalentes. Los objetos de puntero automático tienen un contrato completamente diferente, por lo que la copia crea una transferencia de propiedad. Esto significa que los contenedores de auto_ptr exhibirán un comportamiento extraño, dependiendo del uso.

Hay una descripción detallada de lo que puede salir mal en el artículo 8 de Effective STL (Scott Meyers) y también una descripción no tan detallada en el artículo 13 de Effective C ++ (Scott Meyers).





c++-faq