auto_ptr es una plantilla de clase que estaba disponible en versiones anteriores de la biblioteca estándar de C ++ (declarada en el
archivo de encabezado ), que proporciona algunas características básicas de RAII para punteros en bruto de C ++ . Ha sido reemplazada por la clase unique_ptr .
La auto_ptr
clase de plantilla describe un objeto que almacena un puntero a un único objeto asignado que asegura que el objeto al que apunta se destruya automáticamente cuando el control abandona un ámbito. [1]
El estándar C ++ 11auto_ptr
quedó obsoleto, reemplazándolo con la unique_ptr
plantilla de clase. [2] [3] auto_ptr
se eliminó por completo en C ++ 17 . [4] Para la propiedad compartida, shared_ptr
se puede utilizar la clase de plantilla. shared_ptr
se definió en C ++ 11 y también está disponible en la biblioteca Boost para su uso con versiones anteriores de C ++. [5]
Declaración
La auto_ptr
clase se declara en ISO / IEC 14882 , sección 20.4.5 como:
espacio de nombres std { plantilla < clase Y > struct auto_ptr_ref {}; plantilla < clase X > clase auto_ptr { public : typedef X element_type ; // 20.4.5.1 construir / copiar / destruir: explícito auto_ptr ( X * p = 0 ) throw (); auto_ptr ( auto_ptr & ) throw (); plantilla < clase Y > auto_ptr ( auto_ptr < Y > & ) throw (); auto_ptr & operator = ( auto_ptr & ) throw (); plantilla < clase Y > auto_ptr & operator = ( auto_ptr < Y > & ) throw (); auto_ptr & operator = ( auto_ptr_ref < X > ) throw (); ~ auto_ptr () lanzar (); // 20.4.5.2 miembros: X & operator * () const throw (); Operador X * -> () const throw (); X * get () const throw (); X * suelta () lanza (); anular reiniciar ( X * p = 0 ) lanzar (); // 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
El auto_ptr
tiene la semántica de riguroso dominio, lo que significa que la auto_ptr
instancia es la única entidad responsable de la vida del objeto. Si auto_ptr
se copia un, la fuente pierde la referencia. Por ejemplo:
#include #include usando el espacio de nombres std ; int main ( int argc , char ** argv ) { int * i = new int ; auto_ptr < int > x ( i ); auto_ptr < int > y ; y = x ; cout << x . get () << endl ; // Imprimir NULL cout << y . get () << endl ; // Imprimir dirección no NULL i return 0 ; }
Este código imprimirá una dirección NULL para el primer auto_ptr
objeto y alguna dirección no NULL para el segundo, mostrando que el objeto fuente perdió la referencia durante la asignación ( =
). El puntero sin formato i
en el ejemplo no debe eliminarse, ya que lo eliminará el auto_ptr
propietario de la referencia. De hecho, se new int
podría pasar directamente a x
, eliminando la necesidad de i
.
Observe que el objeto apuntado por un auto_ptr
se destruye usando operator delete
; esto significa que solo debe utilizar auto_ptr
para punteros obtenidos con operator new
. Esto excluye los punteros devueltos por malloc/calloc/realloc
y los punteros a matrices (porque las matrices son asignadas por y deben ser desasignadas por ).operator new[]
operator delete[]
Debido a su semántica de copia, auto_ptr
no se puede utilizar en contenedores STL que puedan realizar copias de elementos en sus operaciones.
Ver también
Referencias
- ^ "clase auto_ptr" . Microsoft . Consultado el 27 de septiembre de 2006 .
- ^ "Borrador de trabajo, estándar para el lenguaje de programación C ++ N3242" (PDF) . 28 de febrero de 2011. p. 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 de evolución de bibliotecas JTC1 / SC22 / WG21 N4190" . 2014-10-09 . Consultado el 29 de agosto de 2016 .
- ^ "Recopilación de objetos compartidos" . Dr. Dobb's. 2004-07-01 . Consultado el 27 de septiembre de 2006 .
enlaces externos
- Usar
auto_ptr
eficazmente - Evitar pérdidas de memoria con
auto_ptr
- Artículo " Uso de la
auto_ptr
plantilla de clase para facilitar la gestión dinámica de la memoria " por Danny Kalev - Artículo " Contenedor de
auto_ptr
" de Zeeshan Amjad - Artículo " Actualización sobre
auto_ptr
" de Scott Meyers auto_ptr
Referencia de plantilla de clase de GNU libstdc ++auto_ptr
referencia de Rogue Wave