Figure 2: Undefined behavior banished

//
//    C.h
//
#include <memory>

class CImpl;

class C
    {
public:
    C();
    ~C(); // <== new
private:
    std::auto_ptr<CImpl> pimpl_;
    };

//
//    C.cpp
//
#include "C.h"

class CImpl
    {
    // ...
    };

C::C() : pimpl_(new CImpl)
    {
    }

C::~C() // <== new
    {
    }

//
//    main.cpp
//
#include "C.h"

int main()
    {
    C c;
    return 0;
    }