Destructor no se invoca cuando se genera una excepción en el constructor
¿Por qué no se invoca el destructor en este código?
#include <boost/scoped_ptr.hpp>
#include <iostream>
class MyClass {
boost::scoped_ptr<int> ptr;
public:
MyClass() : ptr(new int) { *ptr = 0; throw; std::cout<<"MyClass Allocated\n"; }
~MyClass() { std::cout<<"MyClass De-allocated\n"; }
int increment() { return ++*ptr; }
};
int main()
{
boost::scoped_ptr<MyClass> myinst(new MyClass);
std::cout << myinst->increment() << '\n';
std::cout << myinst->increment() << '\n';
}
EDITA
De las respuestas, entienda que cuando ocurre una excepción en el constructor, no se invocará destructor. Pero si la excepción ocurre en main (), es decir, después de que el objeto MyClass esté completamente instanciado, ¿se invocará el destructor MyClass? Si no es así, ¿por qué es un puntero inteligente?
Agregando el código
#include <boost/scoped_ptr.hpp>
#include <iostream>
class MyClass {
boost::scoped_ptr<int> ptr;
public:
MyClass() : ptr(new int) { *ptr = 0; std::cout<<"MyClass Allocated\n"; }
~MyClass() { std::cout<<"MyClass De-allocated\n"; }
int increment() { return ++*ptr; }
};
int main()
{
boost::scoped_ptr<MyClass> myinst(new MyClass);
throw 3;
std::cout << myinst->increment() << '\n';
std::cout << myinst->increment() << '\n';
}
Salida
MyClass Allocated
terminate called after throwing an instance of 'int'
Aborted