我想知道C ++标准对这样的代码的说法是什么:
int* ptr = NULL;
int& ref = *ptr;
int* ptr2 = &ref;
在实践中,结果是ptr2
为NULL,但我想知道,这只是一个实现细节还是在标准中明确定义了?
在不同的情况下,取消引用NULL指针应该导致崩溃,但是在这里我取消引用它以获得由编译器作为指针实现的引用,因此实际上没有实际的解除引用NULL。
答案 0 :(得分:44)
取消引用NULL指针是未定义的行为。
事实上,该标准将这种确切的情况称为注释(8.3.2 / 4“参考文献”):
注意:特别是,在明确定义的程序中不能存在空引用,因为唯一 创建这样一个引用的方法是将它绑定到通过解除引用空指针获得的“对象”,这会导致未定义的行为。
顺便说一句:有一次我意识到NULL指针可以以明确定义的方式“解除引用”,作为sizeof
运算符的操作数,因为{{1}的操作数实际上并没有评估(所以dereference实际上从未发生)。
答案 1 :(得分:2)
取消引用NULL指针是C ++标准中明确未定义的行为,因此您看到的是特定于实现的。
从C ++ 0x草案标准中的1.9.4复制(类似于此方面的先前标准):
描述了某些其他操作 在本国际标准中 undefined(例如,。的效果) 取消引用空指针)。 [注意:本国际标准 没有要求 包含的程序的行为 未定义的行为。 - 结束记录]
答案 2 :(得分:1)
取消引用NULL指针是未定义的行为。在解除引用之前,您应该检查值是否为NULL。
答案 3 :(得分:1)
为了完整起见,这个:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232专门讨论了这个问题。
答案 4 :(得分:-2)
int& ref = *ptr;
以上陈述实际上并未取消引用任何内容。因此,在使用ref
(无效)之前没有问题。