假設我們有一個類C++如何在內存中存儲函數和對象?
class A
{
int x;
public:
void sayHi()
{
cout<<"Hi";
}
};
int main()
{
A *a=NULL;
a->sayHi();
}
上面的代碼將編譯上的Turbo C(其中I測試)和打印Hi
作爲輸出。
我期待崩潰,因爲a
是NULL
。更過,如果我做sayHi()
功能虛擬,它說
Abnormal temination(Segmentation fault in gcc)
我知道有很多是依賴於實現的,但如果任何人都可以扔在任何實現一些輕或只是給出一個概述這將是非常好的。
通過空指針調用方法是未定義的行爲。任何事情都可能發生 - 它不必崩潰,但標準允許它。 –
不是C++的人,所以這是一個猜測,但是:你的代碼不需要訪問任何'A'的實例的內存。 'sayHi()'不使用字段'x',它不是虛擬的,因此它不需要訪問vtable來解析。 C++編譯器實際上必須插入一個檢查來查看'a'是否是導致錯誤的有效指針。 – millimoose