首頁 > 後端開發 > C++ > 為什麼空指標上的非虛函數呼叫成功而虛函數呼叫失敗?

為什麼空指標上的非虛函數呼叫成功而虛函數呼叫失敗?

Susan Sarandon
發布: 2025-01-03 20:43:41
原創
505 人瀏覽過

Why Does a Non-Virtual Function Call Succeed on a NULL Pointer While a Virtual Function Call Fails?

存取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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板