2017-10-19 66 views
-1

我想知道我是否可以檢查參考對無效。我相信我可以,但我不確定。與此相關的,我也想知道,如果在下列情況下,我「提領」指針:我可以檢查對null或某種類型的值的引用嗎?

struct Texture { int width; }; 

void useTexture(Texture& texture) 
{ 
    int a = texture.width; 
    //Exception thrown: read access violation. 
texture was nullptr. 
// When I hover the mouse over the argument it says "struct at null" 
} 

int main() 
{ 
    Texture* obj = nullptr; 
    useTexture(*obj); // This is using the dereference operator, 
         // but no exception is thrown here. 
} 

例外只發生在useTexture()函數。在這種情況下,當將* obj參數傳遞給函數時,它不會從這個位置讀取數據,它只是將地址提供給引用,我假設它與傳遞指針時的方式不同。所以,即使我使用瞭解引用運算符,它實際上是否取消了指針的引用?我不這麼認爲。

另外我想知道是否有辦法檢查useTexture()函數,如果引用是有效的。在調試器中,當我將鼠標懸停在參數上時,它說結構是空的,當它拋出異常時它說紋理是nullptr。我假設它是在說nullptr,因爲它的地址是0x00,因爲紋理根本不是指針,而是一個引用。

同樣,如果我這樣做:

Texture* obj = (Texture*)0x80; 
useTexture(*obj); 

不要說「結構在空」它說,它無法讀取數據,並拋出異常時,它說:「在0x80的無效的內存訪問」。這我明白。

我想要做的是在函數中進行安全檢查,檢查函數是否有效。記住人們說引用不能爲空,我想我必須改變函數來獲取一個指針,並且我可以檢查一個像nullptr這樣的指針值。但從我看到的引用也有地址,並且可以爲空。有沒有辦法檢查引用是否有效,而不將其更改爲指針參數?我想解引用問題是一個單獨的問題,但不想提出兩個問題。

編輯:我只是測試,並認爲我可以做這樣的事情:

if ((Texture*)&texture == nullptr) return; 

而是在調用點檢查nullptr的。

回答

1

做這樣的事情:

A * a = nullptr; 
A b = * a; 

是不確定的在C++中。即使你不創建指定變量,它也是未定義的,因爲編譯器可能會通過取消引用a來決定創建一個無名稱的臨時變量。所以這個聲明:

* a; 

也是未定義的。

+0

在第一種情況下,它讀取指針持有的地址。我明白這是一個不行。當使用解引用運算符傳遞給引用時,我懷疑它是否取消引用它,因爲它只是發送它的地址值,就像它對另一個指針那樣。 – Zebrafish

+0

引用不是指針。 –

+0

我知道,我只是說,當我做callfunction(* obj)時,我懷疑它是否在執行任何解引用操作,引用是否需要該對象的地址,就是這樣? – Zebrafish

相關問題