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

Respuestas a la pregunta(10)

Su respuesta a la pregunta