Vida de objetos y duración de almacenamiento en C ++

Vida de objetos y duración de almacenamiento en C ++
Al crear un objeto, su ubicación en la memoria debe establecerse, antes de que se inicialice. La inicialización significa poner valor en la ubicación. La vida útil de un objeto comienza justo después de la inicialización. Cuando un objeto muere, su ubicación (almacenamiento), que el objeto ocupa se libera y luego la computadora se apaga o el almacenamiento es absorbido (utilizado) por otro objeto. Liberar un medio de almacenamiento, haciendo el identificador o puntero que ocupaba el almacenamiento, no válido. La vida útil de un objeto termina, cuando se libera su almacenamiento.

Se necesita algo de tiempo para crear un objeto. Se necesita algo de tiempo para matar un objeto. Cuando se habla de un objeto, hay dos cosas involucradas: la ubicación que es el almacenamiento y el valor. El significado de la duración de la vida y el almacenamiento es similar; Pero la duración se ve más desde el punto de vista de la ubicación que desde el punto de vista del valor. La duración del almacenamiento es el momento desde que una ubicación se asocia a un objeto hasta el momento en que la ubicación se disocia desde el objeto.

El resto de este artículo ilustra la vida útil del objeto y explica brevemente las diferentes duraciones de almacenamiento. Debe tener conocimientos básicos en C ++ para comprender este artículo. También debe tener conocimiento en el alcance de C ++.

Contenido del artículo

  • Ilustración de la vida útil de los objetos
  • Duración de almacenamiento
  • Duración automática de almacenamiento
  • Duración de almacenamiento dinámico
  • Duración de almacenamiento estático
  • Duración de almacenamiento de subprocesos
  • Conclusión

Ilustración de la vida útil de los objetos

Considere el siguiente programa:

#incluir
usando el espacio de nombres STD;
int main ()

if (1 == 1)

int x;
x = 1;
char y;
y = 'a';
cout << x << y << '\n';

regresar 0;

La salida es, 1a .

La vida de un objeto llega a su fin, cuando sale de alcance. La vida útil del objeto X, comienza en "x = 1;" y termina al final del e-Local-Scope. La vida útil del objeto y comienza en "y = 'a';" y termina al final del e-Local-Scope. Antes de que ambos objetos mueran, se emplean en la declaración de Cout .

Duración de almacenamiento

La duración del almacenamiento está determinada por uno de los siguientes esquemas: duración automática de almacenamiento; Duración de almacenamiento dinámico; Duración de almacenamiento estático; Duración de almacenamiento de subprocesos. Categorías de duración de almacenamiento, también se aplican a las referencias.

Duración automática de almacenamiento

Si una variable, no se declara explícitamente como estática, hilt_local o extern, entonces esa variable tiene una duración de almacenamiento automático. Los ejemplos son x e y arriba. La duración de tales variables terminan cuando salen del alcance. El siguiente programa ilustra la duración de almacenamiento automático para una referencia y un puntero, en el alcance global.

#incluir
usando el espacio de nombres STD;
int x = 1;
int & m = x;
char y = 'a';
char* n = & y;
int main ()

cout << m << *n << '\n';
regresar 0;

La salida es, 1a .

La duración de M comienza desde "int & m = x;" y termina al final del programa. La duración de n comienza desde "char* n = & y;" y termina al final del programa.

Duración de almacenamiento dinámico

Tienda gratis

En una computadora moderna, más de un programa se puede ejecutar al mismo tiempo. Cada programa tiene su propia parte de la memoria. El resto de la memoria que no está siendo utilizada por ningún programa se conoce como tienda gratuita. La siguiente expresión se usa para devolver una ubicación para un entero de la tienda gratuita

Nuevo int

Esta ubicación (almacenamiento) para el entero, devuelto, todavía debe identificarse mediante asignación a un puntero. El siguiente código ilustra cómo usar el puntero con la tienda gratuita:

int *ptrint = new int;
*ptrint = 12;
cout<< *ptrInt <<'\n';

La salida es 12 .

Para poner fin a la vida del objeto, use la expresión de eliminación de la siguiente manera:

Eliminar Ptrint;

El argumento para la expresión de eliminación es un puntero. El siguiente código ilustra su uso:

int *ptrint = new int;
*ptrint = 12;
Eliminar Ptrint;

Un puntero creado con la nueva expresión y eliminada con la expresión de eliminación es de duración de almacenamiento dinámico. Este puntero muere a medida que sale del alcance, o se elimina. La duración del objeto en el código anterior comienza en "*ptrint = 12;" y termina al final de la región declarativa (alcance). Hay más en las expresiones nuevas y eliminadas de lo que se ha discutido aquí; ver más tarde.

Duración de almacenamiento estático

Objeto estático

Un objeto declarado estático, se comporta como el objeto ordinario, excepto que su duración de almacenamiento, comienza desde cuando se inicializa hasta el final del programa. No se puede ver fuera de su alcance, pero se puede emplear indirectamente desde fuera de su alcance.

Considere el siguiente programa, que se supone que cuenta de 1 a 5 (no pruebe el programa):

#incluir
usando el espacio de nombres STD;
int fn ()

int stc = 1;
cout << " << stc;
STC = STC + 1;
if (stc> 5)
regresar 0;
fn ();

int main ()

fn ();
regresar 0;

La salida es 1 1 1 1 1 1 1 1 1 ... y nunca termina realmente. La definición de función es una función recurrente; lo que significa que sigue llamándose a sí mismo hasta que se cumpla una condición.

La solución es hacer que el objeto STC estético. Una vez que se ha inicializado un objeto estático, su valor no se puede cambiar, hasta que finalice el programa. El siguiente programa (que puede probar), que es lo mismo que el anterior, pero ahora con STC está estático, cuenta de 1 a 5:

#incluir
usando el espacio de nombres STD;
int fn ()

static int stc = 1;
cout << " << stc;
STC = STC + 1;
if (stc> 5)
regresar 0;
fn ();

int main ()

fn ();
regresar 0;

La salida es: 1 2 3 4 5 .

Nota: La duración de un objeto estático comienza cuando el objeto se ha inicializado y termina al final del programa. Mientras tanto, el objeto se puede usar indirectamente, desde un alcance diferente. Una vez que se ha inicializado un objeto estático, su valor inicial no se puede cambiar, incluso si su definición se reevalúa. En el código anterior, el STC no se restablece, la próxima vez que se llame. La próxima vez que se llama, se incrementa por "STC = STC + 1;".

Miembro de datos estáticos

Un conjunto de variables y funciones relacionadas se puede colocar en una unidad generalizada llamada clase. Si las variables tienen valores particulares, la clase se convierte en un objeto. Sin embargo, un objeto no se crea solo asignando valores a la variable. La clase se instancia para obtener un objeto; y cada objeto creado tiene su propio nombre diferente de otros objetos de la misma clase. El siguiente programa muestra una clase, llamada THECLA y un objeto, llamado OBJ; También muestra cómo el objeto se instancia y se usa en la función Main ():

#incluir
usando el espacio de nombres STD;
Clase THECLA

público:
int num;
vacío func (char cha, const char *str)
cout << "There are " <<
numer << " books worth " <<
cha << str << " in the store." << '\n';

;
int main ()

THECLA OBJ;
obj.num = 12;
obj.func ('$', "500");
regresar 0;

La salida es:

Hay 12 libros por valor de $ 500 en la tienda.

Observe que para asignar el valor de 12 al número variable, el objeto debe ser instanciado, antes de que se pueda realizar la asignación. Es posible que el programador asigne el valor sin instancias de (crear) un objeto. Para lograr esto, la variable, NUM deberá declararse como estática. Luego se accederá como "thecla :: num" sin el nombre del objeto, pero con el nombre de la clase. El siguiente programa ilustra esto:

#incluir
usando el espacio de nombres STD;
Clase THECLA

público:
estatic const int num = 12;
vacío func (char cha, const char *str)
cout << "There are " << num <<
"Libros por valor" << cha << str <<
" en la tienda." << '\n';

;
int main ()

cout << TheCla::num << '\n';
THECLA OBJ;
obj.func ('$', "500");
regresar 0;

La salida es:

12
Hay 12 libros por valor de $ 500 en la tienda.

Tenga en cuenta que para acceder al miembro de datos, Num en main (), el operador de resolución de alcance, :: tenía que usarse. Además, no es que la variable, NUM tuviera que ser constante e inicializada en la descripción de la clase (definición).

Función de miembro estático

Observe que en la lista anterior del programa anterior, para usar la función func en main (), un objeto tuvo que ser instanciado. Es posible que el programador llame a la función sin instancias de (crear) un objeto. Para lograr esto, la definición de función debe estar precedida a la palabra "estática". Entonces se accederá como "thecla :: func ()" sin el nombre del objeto, pero con el nombre de la clase. El siguiente programa ilustra esto para el miembro de datos estáticos y la función de miembro estático:

#incluir
usando el espacio de nombres STD;
Clase THECLA

público:
estatic const int num = 12;
Funce void static (char cha, const char *str)
cout << "There are " << num <<
"Libros por valor" << cha << str <<
" en la tienda." << '\n';

;
int main ()

Thecla :: func ('$', "500");
regresar 0;

La salida es:

Hay 12 libros por valor de $ 500 en la tienda.

Duración de almacenamiento de subprocesos

El hilo como una característica en C ++, aún no ha sido implementado por el compilador G ++. Entonces, en lugar de explicar esto, la cita de la especificación de C ++ se da de la siguiente manera:

  1. Todas las variables declaradas con la palabra clave thread_local tienen una duración de almacenamiento de subprocesos. El almacenamiento para estas entidades durará la duración del hilo en el que se crean. Hay un objeto o referencia distinto por hilo, y el uso del nombre declarado se refiere a la entidad asociada con el hilo actual.
  2. Una variable con duración de almacenamiento de subprocesos se inicializará antes de su primer uso de ODR y, si se construye, se destruirá en la salida de subprocesos."

Conclusión

La vida útil de un objeto comienza cuando se completa su inicialización y termina cuando se libera su almacenamiento. La duración del almacenamiento dinámico comienza cuando el almacenamiento creado por (nuevo tipo) se inicializa y termina cuando el objeto sale del alcance o se elimina por "Eliminar puntero". La duración de un objeto estático comienza cuando el objeto se ha inicializado y termina al final del programa. Una vez que se ha inicializado un objeto estático, su valor inicial no se puede cambiar, incluso si su definición se reevalúa. Se accede a los miembros de datos estáticos y a los miembros de la función estática fuera de la descripción de la clase con "ClassName :: Nombre".