【发布时间】:2012-09-21 13:37:16
【问题描述】:
假设我们有一个类
class A
{
int x;
public:
void sayHi()
{
cout<<"Hi";
}
};
int main()
{
A *a=NULL;
a->sayHi();
}
以上代码将在 Turbo C(我测试过的地方)上编译并打印 Hi 作为输出。
我期待崩溃,因为 a 是 NULL。如果我将sayHi() 函数设为虚拟,它会说
Abnormal temination(Segmentation fault in gcc)
我知道其中很多依赖于实现,但如果有人可以对任何实现有所了解或只是提供一个概述,那就太好了。
【问题讨论】:
-
通过空指针调用方法是未定义的行为。任何事情都可能发生 - 它不必崩溃,但标准允许。
-
不是 C++ 人,所以这是一个猜测,但是:您的代码不需要访问
A实例的任何内存。sayHi()不使用字段x,而且它不是虚拟的,所以它不需要访问 vtable 来解析。 C++ 编译器实际上必须插入检查以查看a是否是导致错误的有效指针。