【发布时间】:2011-07-18 15:29:23
【问题描述】:
为什么下面的代码会运行?
#include <iostream>
class A {
int num;
public:
void foo(){ num=5; std::cout<< "num="; std::cout<<num;}
};
int main() {
A* a;
a->foo();
return 0;
}
输出是
num=5
我使用 gcc 编译它,我在第 10 行只收到以下编译器警告:
(警告:“a”在此函数中未初始化)
但根据我的理解,这段代码不应该根本不运行吗?当 num 不存在时,它为什么将值 5 分配给 num 因为还没有创建 A 类型的对象?
【问题讨论】:
-
+1。另一个问题:如果您没有成员
num,您应该可以期待这项工作吗?例如,如果它只包含std::cout << "num=";,那么它就是本地无国籍的(我是在合理地询问,而不仅仅是提供思考的食物) -
@Merlyn Morgan-Graham:不。这里的代码取消引用了一个未初始化的指针。这是未定义的行为(即程序可以做任何事情(包括看起来可以工作))。
-
@Martin:我想我可以看到规范没有定义这个,所以你不应该依赖它,但是编译器可能会做什么会导致它不起作用(假设没有继承,并且没有数据成员)
-
@Martin:别担心,我不打算这样做。我只是想了解在哪些情况下编译器可能会生成可能导致其中断的代码。我了解 UB 并取消引用未初始化的数据。但是,这个“取消引用运算符”不会(必然)取消引用任何内容。它仅用于初始化
this指针,而this指针在我的场景中未使用。当然,第二个任何人添加/使用对象状态都会中断,但这不是我感兴趣的。除了 vtables,为什么任何 C++ 编译器都会取消引用未使用的 this 指针?
标签: c++ pointers object initialization