☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

用 delete 释放对象需保证其类型完整

2.13 ID_deleteIncompleteType
目录 › next › previous

如果用 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
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.