Деструктор не вызывается при возникновении исключения в конструкторе
Почему деструктор не вызывается в этом коде?
#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';
}
РЕДАКТИРОВАТЬ
Из ответов In понимают, что когда в конструкторе происходит исключение, деструктор вызываться не будет. Но если исключение происходит в main (), т.е. после того, как объект MyClass будет полностью создан, будет ли вызван деструктор MyClass? Если нет, то почему это умный указатель?
Добавление кода
#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';
}
Выход:
MyClass Allocated
terminate called after throwing an instance of 'int'
Aborted