boost :: checked_delete的目的

Cha*_*l72 16 c++ standards boost

我不明白boost :: checked_delete的目的.文件说:

在5.3.5/5中,C++标准允许使用delete-expression删除指向不完整类类型的指针.当类具有非平凡的析构函数或类特定的运算符delete时,行为是未定义的.有些编译器会在删除不完整的类型时发出警告,但不幸的是,并非所有编译器都会发出警告,程序员有时会忽略或禁用警告.

提供的函数和类模板可用于防止这些问题,因为它们需要完整的类型,否则会导致编译错误.

因此,C++标准允许您删除不完整的类型,如果类型具有非平凡的析构函数,则会导致未定义的行为.什么?一个不完整的类型怎么可能有任何析构函数?不完整的类型只是原型吗?

R S*_*hko 17

不完整类型的最常见示例是仅声明的类型:

// this file does not include the definition of foo

class foo;

void bad(foo *f)
{
    delete f;  // undefined behavior if there exists foo::~foo
}
Run Code Online (Sandbox Code Playgroud)

实际上,foo的定义可能如下所示:

class foo
{
public:
    ~foo() { ... };
};
Run Code Online (Sandbox Code Playgroud)

但是如果顶级代码没有"看到"类定义并且只看到类声明,那么代码将被编译.

  • @Viktor:当你调用`delete`时,为任何具有普通析构函数且没有自定义deallocator的类型生成的基本代码是相同的,所以你不需要*编译器生成`delete的完整类型`代码.如果你不明智地使用这种能力,他们选择留下未定义的行为,而不是通过要求这是一个错误来禁止这种合理的情况. (5认同)
  • `checked_delete`试图在类型上调用`sizeof`,如果类型不完整,显然会导致编译器错误. (3认同)