我可以检查针对null或某种类型值的引用吗?

时间:2017-10-19 23:58:23

标签: c++ pointers reference null dereference

我想知道我是否可以检查引用是否无效。我相信我可以,但我不确定。与此相关,我还想知道在以下情况下我是否"解除引用"指针:

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。

1 个答案:

答案 0 :(得分:1)

做这样的事情:

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

在C ++中未定义。即使您不创建命名变量,它也是未定义的,因为编译器可能决定通过解除引用a来创建无名临时。所以这句话:

 * a;

也未定义。