指向Null对象的引用

时间:2011-06-21 06:12:54

标签: c++ pointers object reference null

我看到了这个讨论 - Checking for a null object in C++,我很惊讶没有人谈到引用何时指向空对象。在我们的代码中,我们经常使用null对象。有如下函数返回nullObj。

const Obj&  
nullObj()  
{  
   static obj* nullPtr = NULL;   
   return static_cast<  const Obj&>(*nullPtr);    
}  

实际上,当我再次查看代码以提出这个主题时,我对上述代码的工作方式有一些疑问:

  1. 如何做*nullPtr - 是不是因为nullPtr是一个静态对象,它在堆上分配内存,因此保证有一些空间和

    < / LI>
  2. 由于我们返回对obj的const引用,编译器是否创建了一个临时对象(某种类型的nullObj ??)或者const引用是否作为nullPtr本身的别名?

3 个答案:

答案 0 :(得分:17)

  

我很惊讶没有人谈到引用何时可以指向空对象

那是因为它不能,在一个正确的程序中。

取消引用nullpointer的函数有未定义的行为。允许编译器发出代码,例如,在那时导致崩溃。

然而,UB的一个可能的影响是代码完成了人们认为会做的事情。因此可以发生空引用。我从来没有遇到过,但如果你这样做,那就意味着代码中存在严重的逻辑错误。

您显示的null-object-reference函数的所有用法都是逻辑错误。

你最好用这些用途来解决问题。 ; - )

干杯&amp;第h。,

答案 1 :(得分:6)

  

我很惊讶没有人谈论引用何时可以指向空对象。

从不。

  

(i)怎么可能做* nullPtr - 是不是因为nullPtr是一个静态对象,它在堆上分配内存,因此保证为deref分配一些空间和地址?

不是。您正在取消引用一个空指针,它正在调用未定义的行为。

  

(ii)由于我们返回对obj的const引用,编译器是否创建了一个临时对象(某种类型的nullObj ??)或者const引用是否作为nullPtr本身的别名?

没有。在此阶段,编译器可以生成鼻守护进程或黑洞。如果您非常幸运,您将会遇到分段错误或其他类型的访问冲突。

不要这样做

答案 2 :(得分:1)

  

(i)如何做* nullPtr    - 是不是因为nullPtr是一个静态对象,它被分配了内存   堆,因此它是保证的   有一些空间和地址分配   为deref?

不,这是因为nullPtr是一个初始化为NULL的指针,它根本不是一个对象。

  

(ii)因为我们正在返回const   参考obj,编译器是否创建   一个临时对象(某种形式的   nullObj ??)或将const引用   充当nullPtr本身的别名?

它将是位于内存地址NULL的对象的别名。即:当您实际访问此参考对象的任何成员时 - 您将获得任何(通常是访问冲突,如果系统足够智能,但它确实可以是任何东西,行为是不明显的)。