2014-06-08 84 views
5

在C++的空對象上進行函數調用時返回的布爾值是什麼?對函數調用返回的空值對象的布爾值

ClassDummy* dummy = NULL; 
if (!dummy->dummy_function(1,2,3)) { 
    // Do Something 
} 

不應該根據C++ 11標準返回錯誤嗎?

+0

爲了回答你所有的未來「不應該C++告訴我我做錯了什麼」事先提問:不。對於程序運行的情況,C++會進行大量優化,代價是幾乎沒有任何關於有bug的情況。 – user2357112

回答

2

通過空指針調用方法具有未定義的行爲。該代碼無效,但編譯器不需要告訴你它是。

C++標準定義了許多情況,即使代碼無效,編譯器也不需要提供「診斷」。在很多情況下,原因僅僅是因爲編譯器很難確定代碼是否有效。在你的特定代碼中,這很容易,如果你使用適當的警告級別,一些編譯器實際上可能會給出警告。但是,構造一個更復雜的示例並不會太困難,因爲編譯器不會輕易分辨指針是否爲空。在編譯器不需要進行診斷之前,將代碼標準化非常複雜將很困難,而且可能毫無意義,因此每個實現都需要做出決定。

4

在原始問題dummy有一個未指定的值,可能爲空。但編輯後的效果不會更改:行爲是undefined。它不是任何工具需要檢測到的錯誤:程序員只能在有效對象上調用成員函數。

+0

我已經改變了一些問題。如果指針被顯式標記爲NULL,會不會有錯誤? – ibp73

+4

nope。還是一樣。 ...如果您需要澄清[undefined]的含義(http://dspace.dial.pipex.com/town/green/gfd34/art/bloopers.html):請點擊鏈接! –

+0

@DietmarKühl,哇,我很喜歡那個。 – chris

5

除非dummy已在名稱空間範圍內聲明,否則它未初始化並且其值未指定,即它可能是或不是null。調用nullptr或指向無效內存的指針上的成員函數是未定義的行爲

如果您調用的成員函數不訪問該類的任何其他數據成員,則可能是get away with the correct result;換句話說,如果它不取消對this指針的引用。但是,無論您是否獲得預期的結果,它仍然是未定義的行爲。

編譯器不需要檢測這種無效的函數調用。如果你做了一些明顯的事情,比如初始化一個對象指針到nullptr,然後調用它的成員函數,你可能會看到來自編譯器的診斷,但這不能保證。

2

試圖取消引用這樣的空指針將導致未定義的行爲

(典型地,在大多數系統核心轉儲或存儲器存取的異常。)

+2

而且,如果調用不訪問'* this'的非虛擬成員函數,通常會靜靜地顯示工作。 – hvd

+0

@ hvd無論如何,這是邪惡的。 – songyuanyao

0

調用非靜態成員函數和訪問非靜態成員變量應該產生錯誤。

某些編譯器和運行時環境允許使用帶有NULL指針的static成員變量和成員函數,但根據標準,這仍然是未定義的行爲。

有關更多詳細信息,請參閱C++ static const access through a NULL pointer和接受的答案。