我想知道是否可以检查引用是否无效。我相信我能,但我不确定。与此相关,我还想知道在以下情况下,我是否正在"取消引用"指针:
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()函数中引用是否有效。在调试器中,当我将鼠标悬停在参数上时,它会说结构为null,当它抛出异常时,它说纹理为nullptr。我假设它说nullptr是因为它的地址是0x00,因为纹理根本不是指针,而是引用。
同样,如果我这样做:
Texture* obj = (Texture*)0x80;
useTexture(*obj);
它没有说"struct at null",而是说它不能读取数据,当抛出异常时,它说"0x80处的无效内存访问"。这一点我理解。
我想做的是在函数中进行安全检查,检查它是否有效。记住人们说引用不能为null,我想我必须更改函数以获取指针,并且我可以检查指针值,比如nullptr。但据我所见,引用也有地址,并且可以为null。有没有一种方法可以在不将引用更改为指针参数的情况下检查引用是否有效?我想取消引用问题是一个单独的问题,但我不想做两个问题。
编辑:我只是在测试,我想我可以做一些类似的事情:
if ((Texture*)&texture == nullptr) return;
而不是在调用站点检查nullptr。
这样做:
A * a = nullptr;
A b = * a;
在C++中未定义。即使不创建命名变量,它也是未定义的,因为编译器可能会决定通过取消引用a
来创建一个无名称的临时变量。所以这个声明:
* a;
也是未定义的。