Annex F (informative) Core undefined behavior [ub]

F.3 [expr]: Expressions [ub.expr]

F.3.25[ub:expr.delete.dynamic.array.dynamic.type.differ]
Specified in: [expr.delete]

In an array delete expression, if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.
[Example 1: struct B { virtual ~B(); void operator delete[](void*, std::size_t); }; struct D : B { void operator delete[](void*, std::size_t); }; void f(int i) { D* dp = new D[i]; delete[] dp; // uses D​::​operator delete[](void*, std​::​size_t) B* bp = new D[i]; delete[] bp; // undefined behavior } — end example]