¿Cuándo se destruyen los objetos estáticos?

Tenga cuidado con estas dos personas,
nuevos amigos y viejos enemigos
: Kabir

¿Qué es una palabra clave estática en C++?
La palabra clave estática se puede aplicar a variables locales, funciones, miembros de datos de clase y objetos en C++. La variable local estática conserva sus valores entre la llamada a la función y se inicializa solo una vez. La función estática se puede llamar directamente usando el operador de resolución de alcance precedido por el nombre de la clase (consulte this , this y this para obtener más detalles). C++ también admite objetos estáticos.

¿Qué son los objetos estáticos en C++?
Un objeto se vuelve estático cuando se usa la palabra clave estática en su declaración. Consulte las dos declaraciones siguientes, por ejemplo, en C++.

Test t;             // Stack based object
static Test t1;     // Static object 

La primera declaración cuando se ejecuta crea un objeto en la pila significa que el almacenamiento se asigna en la pila. Los objetos basados ​​en pilas también se denominan objetos automáticos u objetos locales. Los objetos estáticos se inicializan solo una vez y viven hasta que finaliza el programa. El objeto local se crea cada vez que se encuentra su declaración en la ejecución del programa.

a los objetos estáticos se les asigna almacenamiento en el área de almacenamiento estático. el objeto estático se destruye al finalizar el programa. C++ admite tanto el objeto estático local como el objeto estático global . El
siguiente es un ejemplo que muestra el uso del objeto estático local.

#include <iostream>
class Test 
{
public:
    Test()
    {
        std::cout << "Constructor is executed\n";
    }
    ~Test()
    {
        std::cout << "Destructor is executed\n";
    }
};
void myfunc()
{
    static Test obj;
} // Object obj is still not destroyed because it is static
  
int main()
{
    std::cout << "main() starts\n";
    myfunc();    // Destructor will not be called here
    std::cout << "main() terminates\n";
    return 0;
}

Producción:

main() starts
Constructor is executed
main() terminates
Destructor is executed 

Si observamos de cerca la salida de este programa, podemos ver que el destructor para el objeto local llamado obj no se llama después de que se ejecuta su constructor porque el objeto local es estático, por lo que tiene alcance hasta la vida útil del programa, por lo que su destructor será llamado cuando main() termina.

¿Qué sucede cuando eliminamos la estática en el programa anterior?
Como experimento, si eliminamos la palabra clave estática de la función global myfunc(), obtenemos el siguiente resultado:

main() starts
Constructor is called
Destructor is called
main() terminates

Esto se debe a que el objeto ahora es un objeto basado en la pila y se destruye cuando sale del alcance y se llamará a su destructor.

¿Qué hay de los objetos estáticos globales?
El siguiente programa demuestra el uso del objeto estático global.

#include <iostream>
class Test
{
public:
    int a;
    Test()
    {
        a = 10;
        std::cout << "Constructor is executed\n";
    }
    ~Test()
    {
        std::cout << "Destructor is executed\n";
    }
};
static Test obj;
int main()
{
    std::cout << "main() starts\n";
    std::cout << obj.a;
    std::cout << "\nmain() terminates\n";
    return 0;
}

Producción:

Constructor is executed
main() starts
10
main() terminates
Destructor is executed

Este artículo es una contribución de Meet Pravasi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *