Puntero inteligente


En informática , un puntero inteligente es un tipo de datos abstracto que simula un puntero al tiempo que proporciona funciones adicionales, como la gestión automática de la memoria o la comprobación de límites . Dichas características están destinadas a reducir los errores causados ​​por el mal uso de los punteros, al tiempo que mantienen la eficiencia. Los punteros inteligentes suelen realizar un seguimiento de la memoria a la que apuntan y también se pueden utilizar para administrar otros recursos, como las conexiones de red y los identificadores de archivos. Los punteros inteligentes se popularizaron por primera vez en el lenguaje de programación C ++ durante la primera mitad de la década de 1990 como refutación a las críticas a la falta de recolección automática de basura de C ++ . [1][2]

El mal uso del puntero puede ser una fuente importante de errores. Los punteros inteligentes evitan la mayoría de situaciones de pérdida de memoria al hacer que la desasignación de memoria sea automática. De manera más general, hacen que la destrucción de objetos sea automática: un objeto controlado por un puntero inteligente se destruye automáticamente ( finaliza y luego se desasigna) cuando se destruye el último (o único) propietario de un objeto, por ejemplo, porque el propietario es una variable local, y la ejecución sale del alcance de la variable . Los punteros inteligentes también eliminan los punteros colgantes posponiendo la destrucción hasta que un objeto ya no está en uso.

Si un lenguaje admite la recolección automática de basura (por ejemplo, Java o C # ), entonces los punteros inteligentes no son necesarios para los aspectos de recuperación y seguridad de la administración de la memoria, pero son útiles para otros propósitos, como la administración de la residencia de la estructura de datos de la caché y la administración de recursos de los objetos. como identificadores de archivos o sockets de red .

Existen varios tipos de punteros inteligentes. Algunos funcionan con el recuento de referencias , otros al asignar la propiedad de un objeto a un puntero.

Aunque C ++ popularizó el concepto de punteros inteligentes, especialmente la variedad contada por referencias , el predecesor inmediato de uno de los lenguajes que inspiraron el diseño de C ++ tenía referencias contadas por referencias integradas en el lenguaje. C ++ se inspiró en parte en Simula67. [3] El antepasado de Simula67 fue Simula I. En la medida en que el elemento de Simula I es análogo al puntero de C ++ sin nulo , y en la medida en que el proceso de Simula I con una declaración ficticia como cuerpo de actividad es análogo a la estructura de C ++ (que en sí misma es análoga a la de CAR Hoare registroen la obra contemporánea de 1960), Simula I hizo referencia a elementos contados (es decir, expresiones de puntero que albergan indirección) a procesos (es decir, registros) a más tardar en septiembre de 1965, como se muestra en los párrafos citados a continuación. [4]

Los procesos se pueden referenciar individualmente. Físicamente, una referencia de proceso es un puntero a un área de memoria que contiene los datos locales del proceso y alguna información adicional que define su estado actual de ejecución. Sin embargo, por las razones expuestas en la Sección 2.2, las referencias a procesos son siempre indirectas, a través de elementos llamados elementos. Formalmente, una referencia a un proceso es el valor de una expresión de elemento de tipo .

… Los valores de los

elementos se pueden almacenar y recuperar mediante asignaciones y referencias a variables de elementos y por otros medios.

El lenguaje contiene un mecanismo para hacer accesibles los atributos de un proceso desde el exterior, es decir, desde dentro de otros procesos. A esto se le llama acceso remoto. Por tanto, un proceso es una estructura de datos referenciable.