C ++

Vida útil del objeto y duración del almacenamiento en C ++

Vida útil del objeto y duración del almacenamiento en C ++
Al crear un objeto, se debe establecer su ubicación en la memoria antes de inicializarlo. 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 ocupaba el objeto, se libera y luego la computadora se apaga o el almacenamiento es ocupado (usado) por otro objeto. Liberar un medio de almacenamiento, invalidar el identificador o puntero que ocupaba el almacenamiento. La vida útil de un objeto finaliza 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 vida útil y la duración del almacenamiento son similares; 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 tiempo desde que una ubicación se asocia a un objeto hasta el momento en que la ubicación se disocia del 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 conocimientos en el ámbito de C ++.

Contenido del artículo

Ilustración de la vida útil del objeto

Considere el siguiente programa:

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

si (1 == 1)

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

return 0;

La salida es 1A .

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

Duración de almacenamiento

La duración del almacenamiento se determina mediante uno de los siguientes esquemas: duración del almacenamiento automático; duración del almacenamiento dinámico; duración del almacenamiento estático; duración del almacenamiento del hilo. Categorías de duración de almacenamiento, también se aplican a referencias.

Duración del almacenamiento automático

Si una variable no se declara explícitamente como estática, thread_local o extern, esa variable tiene una duración de almacenamiento automática. Los ejemplos son xey arriba. La duración de tales variables finaliza cuando salen de su alcance. El siguiente programa ilustra la duración del almacenamiento automático para una referencia y un puntero, en el ámbito 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';
return 0;

La salida es 1A .

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

Duración de almacenamiento dinámico

Tienda gratis

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

nuevo int

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

int * ptrInt = nuevo int;
* ptrInt = 12;
cout<< *ptrInt <<'\n';

La salida es 12 .

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

eliminar ptrInt;

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

int * ptrInt = nuevo int;
* ptrInt = 12;
eliminar ptrInt;

Un puntero creado con la nueva expresión y eliminado con la expresión de eliminación tiene una duración de almacenamiento dinámico. Este puntero muere cuando se 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 new y delete de lo que se ha discutido aquí - ver más adelante.

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 que se inicializa hasta el final del programa. No se puede ver fuera de su alcance, pero indirectamente se puede emplear 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;
si (stc> 5)
return 0;
fn ();

int main ()

fn ();
return 0;

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

La solución es hacer que el objeto stc sea estático. Una vez que se ha inicializado un objeto estático, su valor no se puede cambiar, hasta que el programa finaliza. El siguiente programa (que puede probar), que es el mismo que el anterior, pero ahora con stc hecho 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;
si (stc> 5)
return 0;
fn ();

int main ()

fn ();
return 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 finaliza al final del programa. Mientras tanto, el objeto se puede utilizar indirectamente, desde un ámbito diferente. Una vez que se ha inicializado un objeto estático, su valor inicial no se puede cambiar, incluso si se vuelve a evaluar su definición. En el código anterior, el stc no se restablece, la próxima vez que se llame. La próxima vez que se llame, se incrementará en "stc = stc + 1;".

Miembro de datos estáticos

Un conjunto de variables y funciones relacionadas se puede poner en una unidad generalizada llamada clase. Si a las variables se les dan valores particulares, la clase se convierte en un objeto. Sin embargo, un objeto no se crea simplemente asignando valores a la variable. Se crea una instancia de la clase para obtener un objeto; y cada objeto creado tiene su propio nombre diferente al 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 se crea una instancia del objeto y cómo se usa en la función main ():

#incluir
usando el espacio de nombres std;
clase TheCla

público:
int num;
void func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int main ()

TheCla obj;
obj.num = 12;
obj.func ('$', "500");
return 0;

La salida es:

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

Tenga en cuenta que para asignar el valor de 12 a la variable num, el objeto debe ser instanciado, antes de que la asignación pueda tener lugar. Es posible que el programador asigne el valor sin instanciar (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:
estática const int num = 12;
void func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int main ()

cout << TheCla::num << '\n';
TheCla obj;
obj.func ('$', "500");
return 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 ser utilizado. Tampoco es que la variable, num tuviera que hacerse constante e inicializarse en la descripción de la clase (definición).

Función de miembro estático

Tenga en cuenta que en la lista de programas anterior, para poder usar la función func en main (), se tenía que crear una instancia de un objeto. Es posible que el programador llame a la función sin instanciar (crear) un objeto. Para lograr esto, la definición de la función debe ir precedida de la palabra "estática". Luego se accederá como "TheCla :: func ()" sin el nombre del objeto, pero con el nombre de la clase. El siguiente programa ilustra esto para miembros de datos estáticos y funciones de miembros estáticos:

#incluir
usando el espacio de nombres std;
clase TheCla

público:
estática const int num = 12;
función de vacío estático (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int main ()

TheCla :: func ('$', "500");
return 0;

La salida es:

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

Duración del almacenamiento de subprocesos

Thread como 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 de estas entidades tendrá una duración de 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 odr y, si se construye, se destruirá al salir del subproceso."

Conclusión

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

Chrys

Vulkan para usuarios de Linux
Con cada nueva generación de tarjetas gráficas, vemos que los desarrolladores de juegos superan los límites de la fidelidad gráfica y se acercan un pa...
OpenTTD frente a Simutrans
Crear su propia simulación de transporte puede ser divertido, relajante y extremadamente atractivo. Es por eso que debes asegurarte de probar tantos j...
Tutorial de OpenTTD
OpenTTD es uno de los juegos de simulación empresarial más populares que existen. En este juego, necesitas crear un maravilloso negocio de transporte....