我想知道我是否可以检查引用是否无效。我相信我可以,但我不确定。与此相关,我还想知道在以下情况下我是否"解除引用"指针:
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参数传递给函数时,它不会从该位置读取数据,它只是将地址提供给引用,我假设没有与传递时相同的方式。指针。所以,即使我使用了dereference运算符,它实际上是否取消引用指针?我不这么认为。
此外,我想知道如果引用有效,是否有办法检查useTexture()函数。在调试器中,当我将鼠标悬停在参数上时,它表示结构为null,当它抛出异常时,它表示纹理为nullptr。我假设它说的是nullptr,因为它的地址是0x00,因为纹理根本不是一个指针,而是一个引用。
同样,如果我这样做:
Texture* obj = (Texture*)0x80;
useTexture(*obj);
而不是说" struct at null"它说它无法读取数据,并且在抛出异常时它表示"无效的内存访问在0x80"。我明白了。
我想要做的是在检查其有效性的功能中进行安全检查。记住人们说引用不能为空,我认为我必须更改函数以获取指针,我可以检查指针值,如nullptr。但是从我所看到的引用中也有地址,并且可以为空。有没有办法检查引用是否有效而不将其更改为指针参数?我想解除引用问题是一个单独的问题,但并不想提出两个问题。
编辑:我只是在测试,并认为我可以做类似的事情:
if ((Texture*)&texture == nullptr) return;
而不是在呼叫站点检查nullptr。
答案 0 :(得分:1)
做这样的事情:
A * a = nullptr;
A b = * a;
在C ++中未定义。即使您不创建命名变量,它也是未定义的,因为编译器可能决定通过解除引用a
来创建无名临时。所以这句话:
* a;
也未定义。