C++:对“超出作用域”对象的引用

7

关于引用,有一件事我一直不太理解,希望你能帮我解答。据我所知,引用不能为null。但是如果你有一个函数foo()返回一个指向堆栈对象的引用,会发生什么:

Object & foo(){
    Object o;
    return o;
}

Object & ref = foo();

理论上的引用会指向一个不存在的对象,因为o在函数返回时就超出了其作用域。这里发生了什么?


2
一个空指针不等同于一个无效指针! - leftaroundabout
澄清一下 - 没有任何东西可以防止引用为 null。你只是不能直接引用 null - Konrad
即使在实践中,“ref” 也会指向一个不存在的对象,就像“法国现任国王”一样。 - molbdnilo
可能是 C++ 引用离开作用域时会发生什么? 的重复问题。 - Calimo
3个回答

12

这将导致未定义的行为。不要这样做。

就实现而言,实际上,引用会指向调用 foo 的堆栈帧所在的堆栈,那个内存在许多情况下仍然是有意义的,因此错误通常不会立即显现。因此,您应该注意永远不要创建类似于悬空引用的东西。


1

在使用返回的引用之前不要有任何操作 - 否则你将会读写覆盖你的堆栈


1
在这种情况下的行为是未定义的,在 C++ 中这并不特别奇怪。这与指针设置为已超出作用域的局部变量的情况基本相同。C++ 要求您控制句柄引用和所引用对象的生命周期。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接