我想知道我是否可以檢查參考對無效。我相信我可以,但我不確定。與此相關的,我也想知道,如果在下列情況下,我「提領」指針:我可以檢查對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的。
在第一種情況下,它讀取指針持有的地址。我明白這是一個不行。當使用解引用運算符傳遞給引用時,我懷疑它是否取消引用它,因爲它只是發送它的地址值,就像它對另一個指針那樣。 – Zebrafish
引用不是指針。 –
我知道,我只是說,當我做callfunction(* obj)時,我懷疑它是否在執行任何解引用操作,引用是否需要該對象的地址,就是這樣? – Zebrafish