【发布时间】:2014-12-23 20:58:44
【问题描述】:
为什么不完整类型的删除定义为“未定义行为”?
来自 C++ 规范; §5.3.5/5;
如果要删除的对象在删除时具有不完整的类类型,并且完整的类具有非平凡的析构函数或释放函数,则行为未定义。
给出代码示例(我明白为什么会出错);
class ABC;
int main()
{
ABC* p = nullptr;
delete p;
}
为什么当 gcc、clang 和 msvc 都警告它是一个不完整的类型时,它被定义为 未定义的行为?为什么不只是在那个时候出错,即为什么它不是可诊断的错误?
【问题讨论】:
-
@Cyber。这就是为什么它是一个错误。我想知道为什么它被定义为“未定义的行为”——为什么编译器不需要编译失败?
-
对于已声明但尚未定义的类中的任何方法,实际上可能会引发该问题。但是,编译器知道析构函数存在并且可能具有特定定义(微不足道的定义),而不是任何其他任意方法。它唯一不知道的是析构函数是否是虚拟的,这可能会改变调用约定(这一点由另一个问题的答案提出)。
-
我的猜测是规范走向乐观,说这个问题只需要一个警告,希望程序员知道他在做什么,并提供一个符合其期望的定义(析构函数不是虚拟的)。
标签: c++ language-lawyer