stringtranslate.com

Vida útil del objeto

En programación orientada a objetos (OOP), la vida útil de un objeto es el período de tiempo entre la creación de un objeto y su destrucción. En algunos contextos de programación, la vida útil del objeto coincide con la vida útil de una variable que representa el objeto. En otros contextos, donde se accede al objeto por referencia , la vida útil del objeto no está determinada por la vida útil de una variable. Por ejemplo, la destrucción de la variable sólo puede destruir la referencia; no el objeto al que se hace referencia.

Terminología

Los aspectos de la vida útil de los objetos varían entre lenguajes de programación y dentro de las implementaciones de un lenguaje. Los conceptos básicos son relativamente comunes, pero la terminología varía. Por ejemplo, los conceptos de crear y destruir a veces se denominan construir y destruir y los elementos del lenguaje se denominan constructor (ctor) y destructor (dtor).

Determinismo

La creación de un objeto es generalmente determinista , pero la destrucción varía según el contexto de programación. Algunos contextos permiten una destrucción determinista, pero otros no. En particular, en un entorno de recolección de basura, los objetos se destruyen cuando el recolector de basura así lo decide.

La sintaxis para la creación y destrucción varía según el contexto de programación. En muchos contextos, incluidos C++, C# y Java, un objeto se crea mediante una sintaxis especial como . En C++, que proporciona administración manual de memoria , un objeto se destruye mediante la palabra clave. En C# y Java, sin una sintaxis de destrucción explícita, el recolector de basura destruye los objetos no utilizados de forma automática y no determinista.new typename()delete

Un enfoque alternativo y determinista para la destrucción automática es donde el objeto se destruye cuando el código reduce el recuento de referencias del objeto a cero.

Con un grupo de objetos , donde los objetos pueden crearse con anticipación y reutilizarse, la creación y destrucción aparente de un objeto puede no corresponder a la real. El grupo proporciona reinicialización para la creación y finalización para la destrucción. Tanto la creación como la destrucción pueden ser no deterministas.

Los objetos con asignación de memoria estática tienen una vida útil que coincide con la ejecución de un programa, pero el orden de creación y destrucción de los distintos objetos estáticos generalmente no es determinista.

Ciclo vital

El ciclo de vida del objeto se refiere a los eventos que experimenta un objeto, incluidos y entre la creación y la destrucción.

El ciclo de vida generalmente incluye gestión de memoria y operaciones después de la asignación y antes de la desasignación. La creación de objetos generalmente consiste en la asignación de memoria y la inicialización , donde la inicialización incluye la asignación de valores a los campos y la ejecución del código de inicialización. La destrucción de objetos generalmente consiste en la finalización (también conocida como limpieza) y la desasignación de memoria (también conocida como gratuita). Estos pasos generalmente se realizan en el siguiente orden: asignar, inicializar, finalizar y desasignar.

Según el contexto de programación, estos pasos pueden automatizarse parcial o totalmente, y algunos de los pasos pueden personalizarse.

La frecuencia de personalización tiende a variar según el paso y el contexto de programación. La inicialización es el paso personalizado más habitual. La finalización es común en lenguajes con destrucción determinista, especialmente C++, pero poco común en lenguajes con recolección de basura. La asignación rara vez se personaliza y la desasignación generalmente no se puede personalizar.

Creación

La forma de crear objetos varía según los contextos de programación. En algunos lenguajes basados ​​en clases, un constructor maneja la inicialización. Al igual que otros métodos, un constructor se puede sobrecargar para admitir la creación con un estado inicial diferente.

Destrucción

Generalmente, un objeto se elimina de la memoria cuando ya no es necesario. Sin embargo, si hay suficiente memoria o un programa tiene un tiempo de ejecución corto, es posible que no se produzca la destrucción del objeto; la memoria simplemente se desasigna al finalizar el proceso.

En algunos casos, la destrucción de objetos consiste únicamente en desasignar memoria, particularmente con la recolección de basura, o si el objeto es una estructura de datos antigua y simple . En otros casos, la limpieza se realiza antes de la desasignación, en particular destruyendo objetos miembro (en la gestión manual de la memoria) o eliminando referencias del objeto a otros objetos para disminuir el recuento de referencias (en el recuento de referencias). Esto puede ser automático o se puede invocar un método de destrucción especial en el objeto.

En lenguajes basados ​​en clases con vida útil determinista del objeto, en particular C++, se llama a un destructor cuando se elimina una instancia, antes de que se desasigne la memoria. En C++, los destructores se diferencian de los constructores en varios aspectos. No pueden sobrecargarse, no deben tener argumentos, no necesitan mantener invariantes de clase y pueden provocar la terminación del programa si generan excepciones.

Con la recolección de basura , los objetos pueden destruirse cuando el programa ya no puede acceder a ellos. El recolector de basura llama a un finalizador antes de desasignar la memoria.

La destrucción de un objeto hará que cualquier referencia al objeto deje de ser válida. Con la gestión manual de la memoria, cualquier referencia existente se convierte en una referencia pendiente . Con la recolección de basura, los objetos sólo se destruyen cuando no hay referencias a ellos.

Consistencia

La vida útil del objeto comienza cuando se completa la asignación y finaliza cuando comienza la desasignación. Por lo tanto, durante la inicialización y finalización, un objeto está vivo, pero puede no estar en un estado consistente. El período entre el momento en que se completa la inicialización y el momento en que comienza la finalización es cuando el objeto está vivo y en un estado consistente.

Si la creación o destrucción falla, el informe de errores (por ejemplo, generar una excepción) puede resultar complicado ya que el objeto u objetos relacionados pueden estar en un estado inconsistente.

Para una variable estática , cuya vida útil coincide con la ejecución del programa, un error de creación o destrucción es problemático ya que la ejecución del programa es antes o después de la ejecución normal.

Programación basada en clases

En la programación basada en clases, la creación de objetos también se conoce como instanciación (creación de una instancia de una clase ). La creación y destrucción se pueden personalizar mediante un constructor y un destructor y, a veces, con métodos de inicializador y finalizador separados .

En particular, un constructor es un método de clase ya que no hay ningún objeto (instancia) disponible hasta que se crea el objeto, pero los destructores, inicializadores y finalizadores son métodos de instancia.

Además, los constructores y los inicializadores a menudo pueden aceptar argumentos, mientras que los destructores y finalizadores generalmente no lo hacen, ya que a menudo son implícitamente invocables.

Administracion de recursos

En lenguajes con objetos de tiempo de vida deterministas, el tiempo de vida se puede utilizar para complementar la gestión de recursos . Esto se llama el modismo La adquisición de recursos es inicialización (RAII). Los recursos se adquieren durante la inicialización y se liberan durante la finalización. En lenguajes con objetos de vida útil no deterministas (es decir, recolección de basura), la gestión de la memoria generalmente se mantiene separada de la gestión de otros recursos.

Ejemplos

C++

Una clase C++ se puede declarar con valores predeterminados como:

clase Foo {};  

Cuando se declara en un contexto automático, el objeto se destruye al cerrar el bloque en el que se declara.

int barra () { Foo foo (); // foo se destruye aquí }     

Cuando se crea dinámicamente, vive hasta que se destruye explícitamente.

int bar () { Foo * pFoo = nuevo Foo (); eliminar pFoo ; }         

Java

Una clase Java se puede declarar con valores predeterminados como:

clase  Foo {} 

Después de que se crea una instancia (es decir new Foo()), vive hasta que no tiene referencias y el recolector de basura la elimina.

Referencias