Listing 2: An array-delete expression with undefined behavior

#include <iostream> #include <new> class B {< public: B(); virtual ~B(); void operator delete(void *p) throw (); void operator delete[](void *p) throw (); int b; }; B::B() : b(0) { cout << "B()\n"; } B::~B() { cout << "~B()\n"; } void B::operator delete(void *p) throw () { ::operator delete(p); } void B::operator delete[](void *p) throw () { ::operator delete[](p); } class D : public B { public: D(); ~D(); void operator delete(void *p) throw (); void operator delete[](void *p) throw (); int d; }; D::D() : d(0) { cout << "D()\n"; } D::~D() { cout << "~D()\n"; } void D::operator delete(void *p) throw () { ::operator delete(p); } void D::operator delete[](void *p) throw () { ::operator delete[](p); } void delete_array(B *bp) { delete [] bp; } int main() { D *dp = new D[2]; delete_array(dp); return 0; }

//End of File