【问题标题】:Why is VC++ C4150 (deletion of pointer to incomplete type) only a warning?为什么 VC++ C4150(删除指向不完整类型的指针)只是一个警告?
【发布时间】:2009-08-13 11:06:53
【问题描述】:

当然,警告是必须处理的,但是为什么VC++ C4150(删除指向不完整类型的指针)只是警告?

【问题讨论】:

    标签: c++ compiler-construction visual-c++ compiler-warnings


    【解决方案1】:

    因为标准说它是合法的,虽然很危险:5.3.5

    如果被删除的对象有 不完整的类类型 删除和完整的类有一个 非平凡的析构函数或 释放函数,行为是 未定义。

    【讨论】:

    • ... 表示当类型的析构函数是平凡的时候,它是合法的。由于编译器不知道类型,它不知道析构函数是否微不足道,也无法确定行为是否未定义。
    【解决方案2】:

    您收到此警告是前向声明的结果。所以编译器已经识别出它是结构/类,但不确定调用析构函数。

    最可能的警告感与 msvc 的第二遍代码分析有关。当解析后一个类时,编译器可以决定是否存在析构函数。

    【讨论】:

      【解决方案3】:

      这在 C++ 中是合法的,尽管这通常是个坏主意。

      粗略地说,警告级别 1 属于“您可能会感到惊讶,但我忽略了您所说的”类型,以及一些选定的语句,其中生成的代码很可能不正确且容易崩溃。

      所以 WL 2 是合适的,因为它是合法的,并且在许多情况下完全可以删除不完整的类型。

      当然,这种推理只是有根据的猜测。也许微软掷骰子来分配这个警告级别。

      【讨论】:

      • Maybe Microsoft rolled the dice to assigne this warning level.:D
      猜你喜欢
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      相关资源
      最近更新 更多