海湾合作委员会警告[Wuninitialized]

Dug*_*las 5 c++ gcc gcc-warning

为什么GCC 4.7在函数内实例化一个类(带指针)时会抱怨?

坏:

#include "foo.h"

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

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

好:

#include "foo.h"

Foo *foo;

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

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

好:

#include "foo.h"

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

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

use*_*396 6

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

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


Jas*_*oco 5

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

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

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