首頁 > 後端開發 > C++ > 為什麼空指標上的非虛擬方法呼叫有時可以避免 C 中的崩潰?

為什麼空指標上的非虛擬方法呼叫有時可以避免 C 中的崩潰?

DDD
發布: 2024-12-14 09:29:12
原創
837 人瀏覽過

Why Do Non-Virtual Method Calls on Null Pointers Sometimes Avoid Crashes in C  ?

非虛擬方法呼叫與空指標:悖論

透過空指標存取類別成員通常會導致崩潰。然而,在 C 中,某些非虛擬方法似乎即使使用空指標也可以工作。這種行為引發了幾個問題:這是如何發生的,以及物件在哪裡分配?

理解非虛擬方法呼叫

在 C 中,當在 null 上呼叫非虛擬方法時指針,編譯器產生對與此方法關聯的函數的直接呼叫。它透過將隱藏參數(指向物件的指標)傳遞給函數來實現此目的。

在提供的範例中:

class Foo {
  void say_hi();
};

Foo* foo = nullptr;
foo->say_hi();
登入後複製

編譯器將其轉換為:

void Foo_say_hi(Foo* this);

Foo_say_hi(foo);
登入後複製

由於say_hi 方法從不引用物件的成員,因此它不會取消引用空指針,從而避免了錯誤。

未定義的行為和編譯器最佳化

正式地,在空指標上呼叫任何方法都是未定義的行為。但是,編譯器可以透過假設物件不為空來最佳化程式碼。這是有風險的,因為它可能會導致意外行為。

在範例中,編譯器最佳化非虛擬方法呼叫以避免崩潰。但是,需要注意的是,這種行為並不能保證。仍應避免在空指標上呼叫非虛方法,因為這可能會導致未指定的結果。

物件分配

範例中 foo 指標所引用的物件未在主要功能。在堆疊上建立一個類型為 Foo* 的局部變量,分配給它的值為空指標。這意味著該物件本身不存在於記憶體中的任何位置。

以上是為什麼空指標上的非虛擬方法呼叫有時可以避免 C 中的崩潰?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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