【发布时间】:2012-07-04 11:16:40
【问题描述】:
#include <iostream>
using namespace std;
class test
{
int i;
public:
test():i(0){ cout << "ctor called" << endl;}
void show()
{
cout<<"show fun called"<<endl;
}
};
int main(int argc , char *argv[])
{
test *ptr = NULL;
ptr->show();
return 0;
}
显然,不会调用任何 ctor。这是标准吗?或者只是一些编译器优化,因为这个指针没有在 show() 成员函数中使用?
【问题讨论】:
-
解除对空指针的引用是UB。
-
在
show()中添加i = 1;并尝试运行它。 -
克里斯,UB的意思是编译器实现?我正在使用 g++ 4.6.3。 Jesse Good,当然,seg 故障,这是毫无疑问的。我想知道编译器是否会为不需要它的成员函数生成没有这个的代码。
-
@bbc:UB 的意思是“未定义的行为”,与“定义的实现”不同。定义的实现意味着至少定义了行为,尽管该定义可能因编译器而异。还; “当然,段错误,毫无疑问。” - 实际上,有很多疑问,因为行为是未定义的。如果它肯定会导致段错误,那么它将被完美地定义,但事实并非如此。任何事情都可能发生,但实际上可能会出现段错误(您希望如此)。
-
你的代码在大多数编译器下都是有效的[这里没有在 GCC 和 MSVC 上崩溃]。幸运的是,您的 show() 方法符合纯 STATIC 的条件。你没有取消引用指针!指向非多态类的指针上的函数调用不会取消引用指针。它只是用堆栈帧调用方法的地址,其中该指针为零。如果您的代码仅使用全局变量并且从不触及
this指针 - 或非静态数据成员 - 你没问题。触摸静态数据成员也可以。更好的是,只需将您的方法标记为静态并忘记指针!
标签: c++