當我在空對象指針上調用一個成員函數時會發生什么?我在面試中被問到以下幾個問題:class A{public:
void fun()
{
std::cout << "fun" << std::endl;
}};A* a = NULL;a->fun();當執行這些代碼時會發生什么,為什么呢?另見:何時對空實例調用成員函數會導致未定義的行為?
3 回答
皈依舞
TA貢獻1851條經驗 獲得超3個贊
"fun"
幕布斯7119047
TA貢獻1794條經驗 獲得超8個贊
按照標準,這是一種未定義的行為,因此是一件非常糟糕的事情。實際上,大多數編程平臺(包括X86和其他幾個體系結構)都會運行良好。
為什么?考慮類函數是如何在C+中實現的。這不是一個虛擬函數,因此這可以是對一個已知地址的靜態調用。在x86程序集中,我們可以看到
mov A, 0
mov ecx, A
call a__fun
由于_FIN不需要實例數據,即使它接收到NULL此指針,也不會發生任何事情。
仍然糟糕的代碼和任何編譯器都會尖叫,但它可以運行。
HUX布斯
TA貢獻1876條經驗 獲得超6個贊
C+在調用函數之前不檢查指針是否為空 fun()不是虛擬的,因此不需要引用要調用的vtable fun()fun()中的任何成員變量。 A所以它不需要取消對空的引用 this指針。
- 3 回答
- 0 關注
- 645 瀏覽
添加回答
舉報
0/150
提交
取消
