2017-10-19 111 views
-1

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

回答

1

做这样的事情:

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

是不确定的在C++中。即使你不创建指定变量,它也是未定义的,因为编译器可能会通过取消引用a来决定创建一个无名称的临时变量。所以这个声明:

* a; 

也是未定义的。

+0

在第一种情况下,它读取指针持有的地址。我明白这是一个不行。当使用解引用运算符传递给引用时,我怀疑它是否取消引用它,因为它只是发送它的地址值,就像它对另一个指针那样。 – Zebrafish

+0

引用不是指针。 –

+0

我知道,我只是说,当我做callfunction(* obj)时,我怀疑它是否在执行任何解引用操作,引用是否需要该对象的地址,就是这样? – Zebrafish

相关问题