Directorio de artículos
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.
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.
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