亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當我在空對象指針上調用一個成員函數時會發生什么?

當我在空對象指針上調用一個成員函數時會發生什么?

C++ C
阿晨1998 2019-07-02 17:17:56
當我在空對象指針上調用一個成員函數時會發生什么?我在面試中被問到以下幾個問題:class A{public:     void fun()     {         std::cout << "fun" << std::endl;     }};A* a = NULL;a->fun();當執行這些代碼時會發生什么,為什么呢?另見:何時對空實例調用成員函數會導致未定義的行為?
查看完整描述

3 回答

?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

這是一種未定義的行為,所以任何事情都有可能發生。

一個可能的結果就是它只是打印"fun"由于該方法不訪問對象的任何成員變量,因此它被調用(據推測對象所在的內存不需要被訪問,因此不一定會發生訪問沖突)。


查看完整回答
反對 回復 2019-07-02
?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

按照標準,這是一種未定義的行為,因此是一件非常糟糕的事情。實際上,大多數編程平臺(包括X86和其他幾個體系結構)都會運行良好。


為什么?考慮類函數是如何在C+中實現的。這不是一個虛擬函數,因此這可以是對一個已知地址的靜態調用。在x86程序集中,我們可以看到


mov A, 0

mov ecx, A

call a__fun

由于_FIN不需要實例數據,即使它接收到NULL此指針,也不會發生任何事情。


仍然糟糕的代碼和任何編譯器都會尖叫,但它可以運行。


查看完整回答
反對 回復 2019-07-02
?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

在大多數現代計算機上,最可能的行為是它會運行,并打印“樂趣”,因為:

  • C+在調用函數之前不檢查指針是否為空
  • fun()

    不是虛擬的,因此不需要引用要調用的vtable

    fun()

  • fun()

    中的任何成員變量。

    A

    所以它不需要取消對空的引用

    this

    指針。


查看完整回答
反對 回復 2019-07-02
  • 3 回答
  • 0 關注
  • 645 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號