用 delete 释放对象需保证其类型完整
2.13 ID_deleteIncompleteType
如果用 delete 释放“不完整类型(incomplete type)”的对象,且对象的完整类型具有 non-trivial 析构函数,会导致标准未定义的行为。
示例:
struct T; // Forward declaration, the type is incomplete
void foo(T* p) {
delete p; // Non-compliant, undefined behavior
}
struct T {
~T(); // Non-trivial destructor
};
例中指针 p 被释放时,其类型是不完整的,如果指针的完整类型以及相关基类或非静态成员具有显式定义的非默认析构函数,即 non-trivial 析构函数,会导致未定义的行为,相关析构函数可能不会正确执行。
应保证指针的类型在释放前具有完整声明:
struct T {
~T();
};
void foo(T* p) {
delete p; // Compliant
}
依据
ISO/IEC 14882:2003 5.3.5(5)-undefined
ISO/IEC 14882:2011 5.3.5(5)-undefined