我看到了这个讨论 - Checking for a null object in C++,我很惊讶没有人谈到引用何时指向空对象。在我们的代码中,我们经常使用null对象。有如下函数返回nullObj。
const Obj&
nullObj()
{
static obj* nullPtr = NULL;
return static_cast< const Obj&>(*nullPtr);
}
实际上,当我再次查看代码以提出这个主题时,我对上述代码的工作方式有一些疑问:
如何做*nullPtr
- 是不是因为nullPtr是一个静态对象,它在堆上分配内存,因此保证有一些空间和
由于我们返回对obj的const引用,编译器是否创建了一个临时对象(某种类型的nullObj ??)或者const引用是否作为nullPtr本身的别名?
答案 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的对象的别名。即:当您实际访问此参考对象的任何成员时 - 您将获得任何(通常是访问冲突,如果系统足够智能,但它确实可以是任何东西,行为是不明显的)。