smart c++ stl smart-pointers auto-ptr

smart pointers c++



¿Hay alguna razón para usar auto_ptr? (4)

Después de leer la explicación de Jossutis sobre auto_ptr de su libro de STL, tengo una fuerte impresión de que cualquiera sea la tarea en la que intente usarla, fallaría al 100% debido a uno de los muchos errores de auto_ptr.

Mi pregunta es: ¿hay tareas de la vida real donde auto_ptr es realmente útil y encaja bien?


En escenarios simples cuando necesita controlar temporalmente un objeto asignado en el montón, auto_ptr se puede usar sin problemas. Por ejemplo, si necesita crear condicionalmente un objeto que se usará solo dentro de una función, no puede asignarlo en la pila y auto_ptr permite no importar la duración del objeto en caso de que ocurra una excepción.


Uso std::auto_ptr moderación, para garantizar la seguridad de las excepciones. Es decir, para evitar una pérdida de memoria en el caso de que parte de un método arroje una excepción.

Por ejemplo:

Foo &Container::addFoo( const std::string &name ) { // The post conditions of the method require that the new Foo // has been added to this container, but the addition method // may throw exceptiona std::auto_ptr< Foo > foo(new Foo(name)); foo->twiddle();// may throw this->addFoo(*foo);// record reference. May throw return *foo.release(); }

Editado: aclaró que this->addFoo(*foo) registra una referencia.


Yo diría que se puede usar, pero no es la mejor opción.

Primero, es una cuestión de año o menos y auto_ptr está oficialmente desaprobado. En segundo lugar, hay una alternativa superior: unique_ptr . El Dr. Stroustrup dijo una vez sobre unique_ptr :

"Lo que debería haber sido auto_ptr" (pero que no pudimos escribir en C ++ 98)

Entonces, a menos que no tenga la opción, auto_ptr no es una buena opción. Principalmente, porque la mayoría de los compiladores de C ++ implementan move semantics estos días y proporcionan unique_ptr .


Claramente, auto_ptr pierde contra unique_ptr .

Ahora, en un mundo ''estricto de C ++ 03 sin impulso'', uso auto_ptr bastante frecuencia, sobre todo:

  • Para ''funciones de miembro de fábrica'' que devuelven una instancia asignada dinámicamente de un tipo dado: me gusta el hecho de que usar std::auto_ptr en el tipo de retorno explicita que el objeto debe ser eliminado
  • En funciones que asignan un objeto antes de intentar insertarlo en un contenedor después: por ejemplo, para release() solo si std::map<>::insert devuelve esa inserción exitosa
  • En un procedimiento de subproceso que muestra elementos de una cola de mensajes, me gusta almacenar el elemento pop''ed en un const std::auto_ptr para dejar en claro que el mensaje se destruirá sin importar qué.