【发布时间】:2009-08-13 11:06:53
【问题描述】:
当然,警告是必须处理的,但是为什么VC++ C4150(删除指向不完整类型的指针)只是警告?
【问题讨论】:
标签: c++ compiler-construction visual-c++ compiler-warnings
当然,警告是必须处理的,但是为什么VC++ C4150(删除指向不完整类型的指针)只是警告?
【问题讨论】:
标签: c++ compiler-construction visual-c++ compiler-warnings
因为标准说它是合法的,虽然很危险:5.3.5
如果被删除的对象有 不完整的类类型 删除和完整的类有一个 非平凡的析构函数或 释放函数,行为是 未定义。
【讨论】:
您收到此警告是前向声明的结果。所以编译器已经识别出它是结构/类,但不确定调用析构函数。
最可能的警告感与 msvc 的第二遍代码分析有关。当解析后一个类时,编译器可以决定是否存在析构函数。
【讨论】:
这在 C++ 中是合法的,尽管这通常是个坏主意。
粗略地说,警告级别 1 属于“您可能会感到惊讶,但我忽略了您所说的”类型,以及一些选定的语句,其中生成的代码很可能不正确且容易崩溃。
所以 WL 2 是合适的,因为它是合法的,并且在许多情况下完全可以删除不完整的类型。
当然,这种推理只是有根据的猜测。也许微软掷骰子来分配这个警告级别。
【讨论】:
Maybe Microsoft rolled the dice to assigne this warning level.:D