行为未定义。程序的实际行为如何依赖于实现。我期望大多数实现尝试执行代码而不检查指针。所以你的第一个例子应该运行平稳,因为它没有引用该类的任何本地成员。
有趣的是,检查下面的代码做什么:
class ex
{
int i;
public:
ex(int ii = 0):i(ii){}
~ex(){cout<<"dest"<<endl;}
virtual void show()
{
cout<<"show fun called"<<endl;
}
};
int main(int argc , char *argv[])
{
ex *ob = NULL;
ob->show();
return 0;
}
如果该方法是虚拟的,也许在运行时需要访问对象的某些本地数据,导致空指针或错误的地址例外。
EDIT
我用GCC测试上的cygwin以下略作修改示例:
#include <iostream>
using namespace std;
class ex
{
int i;
public:
ex(int ii = 0):i(ii){}
~ex(){cout<<"dest"<<endl;}
void show()
{
cout<<"show fun called"<<endl;
}
virtual void vshow()
{
cout<<"vshow fun called"<<endl;
}
};
int main(int argc , char *argv[])
{
ex *ob = NULL;
ob->show();
ob->vshow();
return 0;
}
,事实上,输出为:
show fun called
Segmentation fault (Core dumped)
这个问题的真正答案是没有人能够回答**究竟会发生什么**。 – Mahesh
@Mahesh技术上说它会导致未定义的行为是答案。我们不知道这种未定义的行为是什么并不重要。换句话说,“未定义的行为”正是会发生的事情。 – sashang
许多问题的另一个问题是[karthik](http://stackoverflow.com/users/644073/karthik)或[user692270](http://stackoverflow.com/users/692270/user692270)接受@karthik的答案。严重的是,你是否患有自卑感? –