【面試題】呼叫空指標時一定會崩潰麼?
阿新 • • 發佈:2020-08-06
經常出現在面試中的一道題:呼叫空指標一定會崩潰麼?
首先我們來看這樣一段程式碼:
class A { public: void print() { cout << "A" << endl; } }; int main() { A* pa = nullptr; pa->print(); return 0; }
這時候明顯能看出來pa是一個空指標。但是這個時候如果你要去執行的話其實並不會崩潰。並且輸出是A。
這是因為這段程式碼實質上是這樣一段程式碼:
void print(A* this) { cout<< "A" << endl; } int main() { A* pa = nullptr; print(pa); return 0; }
可以看出來指標在函式中並沒有被呼叫,所以自然而然也不會崩潰了。
但是如果在A類里加入一個成員變數後,並且呼叫它:
class A { public: void print() { cout << m << endl; } int m = 0; }; int main() { A* pa = nullptr; pa->print();return 0; }
這個時候再去執行自然而然就會崩潰。
原因和上面類似,這段程式碼實質上是這樣一段程式碼:
void print(A* this) { cout << this->m << endl; } int main() { A* pa = nullptr; print(pa); return 0; }
這個時候去呼叫一個空指標的成員變數自然而然會崩潰了。
為什麼呼叫空指標的成員函式不會崩潰,而呼叫空指標的成員變數就會崩潰呢?
是因為成員函式和普通函式沒有本質什麼區別,只是比普通函式多了一個 this 指標而已。
但是成員變數是屬於物件的。如果一個物件沒有分配記憶體,那呼叫物件中的變數自然也無從說起。