我想知道我是否可以检查参考对无效。我相信我可以,但我不确定。与此相关的,我也想知道,如果在下列情况下,我“提领”指针:我可以检查对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