被 delete 释放的对象或数组类型不符合要求
C++-Undefined-Behavior-40
用 delete 释放对象时,对象的静态类型应与动态类型兼容,如果静态类型是动态类型的基类,静态类型应提供虚析构函数,否则导致未定义的行为;用 delete[] 释放数组时,对象的静态类型应与动态类型一致,否则导致未定义的行为。
示例:
struct B { ~B(); };
struct D: B { ~D(); };
B* pDObj = new D;
B* pDArr = new D[123];
delete pDObj; // Undefined behavior
delete[] pDArr; // Undefined behavior
例中基类 B 缺少虚析构函数,pDArr 的类型应为派生类指针。
依据
ISO/IEC 14882:2003 5.3.5(3)-undefined
ISO/IEC 14882:2011 5.3.5(3)-undefined