2010-11-24 45 views
7

比方說你有這樣的事情:檢查空引用?

int& refint; 
int* foo =0; 
refint = *foo; 

你怎麼能驗證是否引用是NULL避免崩潰?

+7

遊曳誰寫的開發商是進入一個黑暗的房間有一把椅子和一個光芒照耀其上。然後你用香菸焚燒他們,直到他們悔改。 – 2010-11-24 20:06:46

回答

11

你不能後期初始化那樣的參考。它在聲明時必須初始化。

在VISUAL C++,我得到

錯誤C2530: 'REFINT':引用 必須初始化

與您的代碼。

如果您「修復」了代碼,崩潰(嚴格來說,未定義的行爲)會在VC++ v10中的參考使用時間發生。

int* foo = 0; 
int& refint(*foo); 
int i(refint); // access violation here 

確保安全的方法是在參考初始化或分配時檢查指針。

int* foo =0; 
if (foo) 
{ 
    int& refint(*foo); 
    int i(refint); 
} 

但仍不能保證foo點的可用內存,也不是說這仍然如此,而引用的範圍。

+0

「崩潰將在參考初始時發生」 - 承諾? ;-) – 2010-11-24 19:18:46

+0

崩潰不需要(並且通常不會)在參考初始階段發生。 UB可能會發生任何事情,包括沒有崩潰。 – 2010-11-24 19:18:53

5

你沒有,當你有一個「空」的引用你已經有未定義的行爲。在嘗試通過解引用指針來形成引用之前,應該始終檢查指針是否爲空。

(你的代碼是非法的;你不能創建一個未初始化的參考和嘗試,並通過賦予其綁定;你只能在初始化過程中綁定。)

4

一般情況下,你不能。

無論誰「創建空引用」(或試圖,我應該說)已經調用了未定義的行爲,因此代碼可能(或可能不會)崩潰,然後您有機會檢查任何內容。

誰創建的參考應該做的:

int *foo = 0; 
if (foo) { 
    int &refint = *foo; 
    ... use refint for something ... 
} 

通常它被認爲來電者的問題,如果他們寫*foofoo是空的,它不是一個函數有責任爲您在那種錯誤的其他功能的代碼。但是你可以通過你的代碼扔掉像assert(&refint);這樣的東西。他們可能會幫助您發現您的呼叫者所犯的錯誤,因爲畢竟您寫的任何功能對您來說都是合理的機會。

-5

您不需要,引用不能爲空。

閱讀說明書。

0

爲了使上面的代碼編譯,你將不得不切換順序:

int* foo =0; 
int& refint = *foo; // on actual PCs, this code will crash here 

(有可能是舊的處理器或運行時的架構,其中這個工作。)

0

....說以上所有的,如果你做有一個空引用,使用boost::optional<>,就像一個魅力..

1

所有的答案以上是正確的,但如果由於某種原因,你想這樣做,我想至少有一個人應該提供答案。我目前正在試圖追蹤某些源代碼中的錯誤引用,並且看看是否有人刪除了此引用並在某個時刻將其設置爲null會很有用。希望這不會導致許多反對票。

#include <iostream> 
    int main() 
    { 
     int* foo = nullptr; 
     int& refint = *foo; 

     if(&refint == nullptr) 
      std::cout << "Null" << std::endl; 
     else 
      std::cout << "Value " << refint << std::endl; 
    } 

輸出: