透過空指標存取類別成員通常會導致崩潰。然而,在 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中文網其他相關文章!