【问题标题】:GCC warning [Wuninitialized]GCC 警告 [Wuninitialized]
【发布时间】:2012-01-08 21:10:17
【问题描述】:

为什么 GCC 4.7 在函数内(使用指针)实例化类时会报错?

不好:

#include "foo.h"

int fn () {
    Foo *foo;
    foo->method();

   return 0;
}

main.cpp:在成员函数“int foo()”中: main.cpp:21:52:警告:“fn”可能在此未初始化时使用 函数[-Wuninitialized]

好:

#include "foo.h"

Foo *foo;

int fn () {
    foo->method();

   return 0;
}

好:

#include "foo.h"

int fn () {
    Foo foo;
    foo.method();

   return 0;
}

【问题讨论】:

  • 静态变量是值初始化的,所以第二个 sn-p 不会引起警告。剩下的,找一本关于 C++ 的好书。
  • 您能否注意发布错误,完全按照编译器报告的错误来发布您发布的确切代码。 “main.cpp: In member function 'int foo()': main.cpp:21:52: warning: 'fn' may be used uninitialized in this function [-Wuninitialized]” 这没有意义,foo 不是一个函数更不用说成员函数了,fn 不是一个变量。
  • 您复制的错误消息中的名称foofn 似乎已颠倒过来。无论是那个还是 C++ 编译器消息都达到了新的误导水平。
  • @Charles Bailey,有很多额外的代码,所以我留下了唯一重要的
  • @Duglas:如果您编辑代码,您应该重新编译并粘贴编辑后代码的编译器的确切输出,否则人们会注意到差异并且不会相信您已发布您需要帮助的实际代码。

标签: c++ gcc gcc-warning


【解决方案1】:

Foo * foo;Foo foo; 之间存在区别第一个声明一个指向 Foo 的 指针,第二个声明并调用 Foo 的默认构造函数。

编辑:也许你打算写Foo * foo= new Foo();,以便在堆上分配一个Foo,它可以比函数调用更长寿。

【讨论】:

    【解决方案2】:

    第一个(坏的), foo 指向一个垃圾指针。您可以通过像Foo* foo = NULL; 一样初始化它来删除警告,但是当您尝试取消引用它时会收到错误(运行时错误)。

    第二个(好)没有抱怨,因为 C 会自动将翻译单元范围内的变量初始化为 NULL 或 0 或适当的等效项(如果它们尚未初始化)。

    最后一个(好)没有抱怨,因为您正在调用对象上的方法,并且函数指针的分配是由编译器完成的,与数字 2 相似但不同。所以编译器已经知道方法 method 的地址,并将该地址分配给 Foo 结构上的适当位置。

    【讨论】:

      【解决方案3】:

      Foo* foo; foo->method()从来没有好。 foo 是一个未初始化的指针,它可能指向垃圾,因此您的代码表现出未定义的行为。 最好的 您可以希望编译器会向您发出警告或错误。如果不是这样,那么至少希望正在运行的程序崩溃

      【讨论】:

        【解决方案4】:

        在你的坏例子中,foo 是一个指针类型的局部变量,它不会自动初始化。 class Foo,在您的正确示例中,使用默认构造函数初始化的。

        您的第一个 »good« 示例使用 0 初始化指针,因为 foo 是一个全局变量。这将导致运行时未定义的行为,因为foo 不指向对象。

        【讨论】:

          【解决方案5】:

          因为正如警告所说,它是未初始化的。还没有对象。实际上,您的第一个示例中 foo 的值是未定义的。它将具有驻留在 foo 所在内存中的值。

          澄清一下,foo(你看到的是 Foo*)实际上是一个 int。 int 的值应该是 Foo 类型对象的地址。要做到这一点,您必须为其分配 foo 的地址。这样做之一是用 new 实例化它:

          Foo* foo = new Foo;
          

          new 返回创建新 Foo 对象的地址。这将删除您的警告:)

          【讨论】:

            猜你喜欢
            • 2023-03-12
            • 1970-01-01
            • 2010-11-25
            • 2012-12-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-17
            相关资源
            最近更新 更多