En el lenguaje de programación C++ , auto_ptr (para puntero automático ) es una plantilla de clase de puntero inteligente obsoleta que estaba disponible en versiones anteriores de la biblioteca estándar de C++ (declarada en el archivo de cabecera ), que proporciona algunas características RAII básicas para punteros sin formato de C++ . Ha sido reemplazada por la clase.<memory>unique_ptr
La auto_ptrclase plantilla describe un objeto que almacena un puntero a un único objeto asignado que garantiza que el objeto al que apunta se destruya automáticamente cuando el control salga de un ámbito. [ 1 ]
Las características de auto_ptrahora se consideran insatisfactorias: se introdujo antes de la semántica de movimiento de C++11 , por lo que utiliza la copia para lo que debería hacerse con los movimientos (y, de forma confusa, establece el puntero copiado auto_ptra un puntero nulo ). Esta semántica de copia implica que no se puede utilizar en contenedores STL . [ 2 ]
El estándar C++11auto_ptr lo hizo obsoleto, reemplazándolo con la unique_ptrplantilla de clase. [ 3 ] [ 4 ]auto_ptr fue eliminado por completo en C++17 . [ 5 ] Para la propiedad compartida, shared_ptrse puede usar la clase plantilla. shared_ptrfue definida en C++11 y también está disponible en la biblioteca Boost para su uso con versiones anteriores de C++. [ 6 ]
Declaración
La auto_ptrclase se declara en la norma ISO/IEC 14882 , sección 20.4.5, como:
espacio de nombres std { plantilla < clase Y > estructura auto_ptr_ref {};plantilla < clase X > clase auto_ptr { público : usando element_type = X ;// 20.4.5.1 construir/copiar/destruir: auto_ptr explícito ( X * p = 0 ) lanzar ();auto_ptr ( auto_ptr & ) throw ();plantilla < clase Y > auto_ptr ( auto_ptr < Y >& ) lanzar ();auto_ptr & operador = ( auto_ptr & ) lanzar ();plantilla < clase Y > auto_ptr & operador = ( auto_ptr < Y >& ) lanzar ();auto_ptr & operador = ( auto_ptr_ref < X > ) lanzar ();~ auto_ptr () throw ();// 20.4.5.2 miembros: X & operador * () const throw (); X * operador -> () const throw (); X * obtener () const throw (); X * liberar () throw (); void reset ( X * p = 0 ) throw ();// 20.4.5.3 conversiones: auto_ptr ( auto_ptr_ref < X > ) throw ();plantilla < clase Y > operador auto_ptr_ref < Y > () lanzar ();plantilla < clase Y > operador auto_ptr < Y > () lanzar (); };}Semántica
Tiene auto_ptruna semántica de propiedad estricta, lo que significa que la auto_ptrinstancia es la única entidad responsable de la vida útil del objeto. Si auto_ptrse copia, la fuente pierde la referencia. Por ejemplo:
#include <iostream> #include <memory>using std :: auto_ptr ; int main ( int argc , char * argv []) { int * a = new int [ 10 ]; auto_ptr < int [] > x ( a ); auto_ptr < int [] > y ; y = x ; std :: cout << x.get () << std :: endl ; // Imprimir NULL std :: cout << y.get () << std :: endl ; // Imprimir la dirección no nula de adevolver 0 ; }Este código imprimirá una dirección NULLauto_ptr para el primer objeto y una dirección no NULL para el segundo, lo que demuestra que el objeto de origen perdió la referencia durante la asignación ( =). El puntero sin formato adel ejemplo no debe eliminarse, ya que será eliminado por el auto_ptrque posee la referencia. De hecho, new intpodría pasarse directamente a x, eliminando la necesidad de a.
Tenga en cuenta que el objeto al que apunta un auto_ptrse destruye usando operator delete; esto significa que solo debe usar auto_ptrpara punteros obtenidos con operator new. Esto excluye los punteros devueltos por malloc/calloc/reallocy los punteros a matrices (porque las matrices son asignadas por y deben ser liberadas por ).operator new[]operator delete[]
Debido a su semántica de copia, auto_ptrno debe utilizarse en contenedores STL que puedan realizar copias de elementos en sus operaciones.
Véase también
Referencias
- ↑ "Clase auto_ptr" . Microsoft . Consultado el 27 de septiembre de 2006 .
- ↑ Meyers, Scott (2014). Effective Modern C++: 42 specific ways to improve your use of C++11 and C++14 . Sebastopol, CA. p. 118. ISBN 978-1-491-90399-5.
{{cite book}}: CS1 mantenimiento: falta el editor de ubicación ( enlace ) - ↑ "Borrador de trabajo, estándar para el lenguaje de programación C++ N3242" (PDF) . 28 de febrero de 2011. pág. 1233. Consultado el 17 de febrero de 2013 .
- ↑ Kalev, Danny. "Uso de unique_ptr, Parte I" . informIT . Consultado el 30 de septiembre de 2010 .
- ↑ "Lenguaje de programación C++, Grupo de trabajo sobre evolución de bibliotecas JTC1/SC22/WG21 N4190" . 9 de octubre de 2014. Consultado el 29 de agosto de 2016 .
- ↑ "Collecting Shared Objects" . Dr. Dobb's. 1 de julio de 2004. Consultado el 27 de septiembre de 2006 .
Enlaces externos
- Utilizar
auto_ptreficazmente - Cómo evitar fugas de memoria con
auto_ptr - Artículo " Uso de la
auto_ptrplantilla de clase para facilitar la gestión dinámica de la memoria " de Danny Kalev - Artículo " Contenedor de
auto_ptr" por Zeeshan Amjad - Artículo " Actualización sobre
auto_ptr" de Scott Meyers auto_ptrReferencia de plantilla de clase de GNU libstdc++auto_ptrReferencia de Rogue Wave
- Biblioteca estándar de C++