让我们说你有这样的事情:
int& refint;
int* foo =0;
refint = *foo;
如何验证引用是否为NULL
以避免崩溃?
答案 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。
阅读手册。