[Análisis en profundidad de C ++] 49. Excepciones en el constructor y destructor

1 Anormalidades en la construcción

  • El proceso de construcción se detiene inmediatamente, el objeto actual no se puede generar
  • Destructor no será llamado
  • El espacio ocupado por el objeto es reclamado inmediatamente

Recomendación: no arroje una excepción en el constructor. Cuando se produzca una excepción en el constructor, utilice el modo de construcción de segundo orden

Programación de experimentos: excepciones en construcción

// 49-1.cpp
#include<iostream>
using namespace std;
class Test
{
public:
    Test()
    {
        cout << "Test()" << endl;
        throw 0;
    }
    virtual ~Test()
    {
        cout << "~Test()" << endl;
    }
};
int main()
{
    Test* p = reinterpret_cast<Test*>(1);
    try
    {
        p = new Test();
    }
    catch(...)
    {
        cout << "Exception" << endl;
    }
    cout << "p = " << p << endl;
    return 0;
}

Excepción lanzada en el constructor. Los punteros de clase usan reinterpret_cast para apuntar a la memoria en la dirección 1. Debido a que la excepción se produce en el constructor, el proceso de construcción se detiene inmediatamente, el objeto actual no se puede generar, no se llamará al destructor y el espacio ocupado por el objeto se reclama de inmediato

Compilar y ejecutar:

$ g++ 49-1.cpp -o 49-1
$ ./49-1
Test()
Exception
p = 0x1

Puede ver que la dirección del puntero p sigue siendo 1, lo que también refleja que el objeto no se genera.

Aquí demostramos que el espacio ocupado por el objeto se recupera inmediatamente. Use valgrind para detectar pérdidas de memoria. Si se recupera la memoria, no hay pérdida de memoria. Debido a que no hay eliminación, si no hay recuperación, hay una pérdida de memoria.
Inserte la descripción de la imagen aquí
Puede ver que no hay pérdida de memoria.

Si comenta el lanzamiento 0; en la línea 10, habrá una pérdida de memoria. Verifiquemos y veamos que se ha producido una pérdida de memoria.
Inserte la descripción de la imagen aquí

2 Anormalidades en la desestructuración

La excepción del destructor hará que los recursos utilizados por el objeto no se liberen por completo. Así que evite lanzar una excepción en el destructor.

3 Resumen

1. No arroje excepciones en el constructor y destructor

Publicado 298 artículos originales · elogiado 181 · 100,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/happyjacob/article/details/104661313
Recomendado
Clasificación