行爲未定義。程序的實際行爲如何依賴於實現。我期望大多數實現嘗試執行代碼而不檢查指針。所以你的第一個例子應該運行平穩,因爲它沒有引用該類的任何本地成員。
有趣的是,檢查下面的代碼做什麼:
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的答案。嚴重的是,你是否患有自卑感? –