C ++标准:解除引用NULL指针以获取引用?

时间:2010-04-28 08:28:59

标签: c++ pointers reference null

我想知道C ++标准对这样的代码的说法是什么:

int* ptr = NULL;
int& ref = *ptr;
int* ptr2 = &ref;

在实践中,结果是ptr2为NULL,但我想知道,这只是一个实现细节还是在标准中明确定义了?
在不同的情况下,取消引用NULL指针应该导致崩溃,但是在这里我取消引用它以获得由编译器作为指针实现的引用,因此实际上没有实际的解除引用NULL。

5 个答案:

答案 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(无效)之前没有问题。