检查空引用?

时间:2010-11-24 19:12:13

标签: c++

让我们说你有这样的事情:

int& refint;
int* foo =0;
refint = *foo;

如何验证引用是否为NULL以避免崩溃?

7 个答案:

答案 0 :(得分:11)

你不能迟到初始化这样的引用。它必须在声明时进行初始化。

在Visual C ++上我得到了

  

错误C2530:'refint':引用   必须初始化

使用您的代码。

如果您“修复”代码,则在VC ++ v10中的引用时间内会发生崩溃(严格来说,未定义的行为)。

int* foo = 0;
int& refint(*foo);
int i(refint);  // access violation here

确保安全的方法是在参考初始化或分配时检查指针。

int* foo =0;
if (foo)
{
  int& refint(*foo);
  int i(refint);
}

虽然仍然不能保证foo指向可用内存,也不保证在引用在范围内时仍然如此。

答案 1 :(得分:5)

当你有一个“null”引用时,你还没有未定义的行为。在尝试通过取消引用指针来形成引用之前,应始终检查指针是否为null。

(您的代码是非法的;您无法创建未初始化的引用并尝试通过分配它来绑定它;您只能在初始化期间绑定它。)

答案 2 :(得分:4)

一般情况下,你不能。

“创建空引用”(或试图,我应该说)已经调用了未定义的行为,因此代码可能(或可能不会)在您有机会检查任何内容之前崩溃。

创建引用的人应该已经完成​​:

int *foo = 0;
if (foo) {
    int &refint = *foo;
    ... use refint for something ...
}

通常,当*foo为空时,如果他们写了foo,则认为是调用者的问题,并且在其他函数的代码中检查该类错误不是一个函数。但你可以通过代码丢弃assert(&refint);之类的内容。它们可能有助于捕捉您的呼叫者所犯的错误,因为毕竟您写的任何功能都有合理的机会,呼叫者就是您自己。

答案 3 :(得分:1)

上面的所有答案都是正确的,但如果由于某种原因你想要这样做,我想至少有一个人应该提供答案。我目前正在尝试在某些源代码中追踪错误的引用,看看是否有人删除了此引用并在某些时候将其设置为null将会很有用。希望这不会产生很多下来的选票。

tableImages

输出:

  

答案 4 :(得分:0)

要编译上面的代码,您必须切换顺序:

int* foo =0;
int& refint = *foo; // on actual PCs, this code will crash here 

(可能有较旧的处理器或运行时架构,这是有用的。)

答案 5 :(得分:0)

答案 6 :(得分:-5)

您不需要,引用不能为null。

阅读手册。