存取NULL 指標上的類別成員:異常和解釋
在提供的C 程式碼片段中,觀察到函數呼叫即使物件指標為NULL,非虛擬方法也會成功,而虛擬函數呼叫會導致應用程式崩潰。這種奇怪的行為提出了兩個基本問題:
1。非虛擬方法如何在 NULL 指標上運作?
與虛擬函數呼叫不同,非虛擬函數呼叫不需要 vtable 查找。編譯器直接將函數呼叫翻譯成指向要執行的特定函數的機器碼指令。該函數將作為隱藏參數傳遞給呼叫該函數的物件的指標。
在給定的程式碼中,函式 say_hi() 不會對 Foo 類別的成員進行任何參考。因此,無需解引用 this 指標即可執行。本質上,對 say_hi() 的呼叫相當於:
void Foo_say_hi(Foo* this); Foo_say_hi(foo); // where foo is NULL
由於函數從不嘗試存取物件的成員,因此它不會遇到取消引用 NULL 指標的未定義行為。
2.物件 foo 在哪裡分配?
在提供的程式碼中,foo 被宣告為 Foo* 類型的局部變數。由於沒有給它特定的記憶體分配,因此它很可能像其他局部變數一樣在主函數的堆疊上分配。然而,foo 中儲存的值是一個 NULL 指針,表示它沒有指向 Foo 類型的有效物件實例。
以上是為什麼空指標上的非虛函數呼叫成功而虛函數呼叫失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!