>>524
> D::~D( ) ;
> Widget::~Widget( ) ;
> Derived::operator delete ( p ) ;

おかしいだろ。
↓このほうが正解に近いかな。

p->~Widget( ) ; // virtual だから実際は ~Derived() が実行される。
Derived::operator delete ( static_cast<Derived*>( p ) ) ;