返回对局部变量的引用

时间:2012-12-20 20:58:20

标签: c++ reference

  

可能重复:
  Returning the address of local or temporary variable
  Can a local variable’s memory be accessed outside its scope?

即使知道由于以下剪辑会发生什么,理解它是如何发生也会有所帮助。接下来是四个问题。

假设:

int& foo()
{
    int i = 1;
    return i;
}

并且知道在下面对本地名为i 的引用被解除引用到分配给intVal的temp和 local i 在结尾处消失 FOO()

int  intVal = foo();

第一个问题 - 在下面,表达式的右侧与上面相同,因此这是编译器看到左侧并且基于上下文知道不取消引用返回的引用的情况,而是用它初始化创建一个新的引用?

第二个问题 - 只有这一点使本地i 坚持在intRef在范围内?

int& intRef = foo();

第三个问题 - bellow intPtr 获取本地i 的地址。那么,编译器是否使用赋值的上下文并决定在取引用的地址之前不去引用以获取值(而不是说取一个包含去引用值的temp的地址)?

第四个问题 - 当 intPtr 在范围内时,本地i 会坚持下去吗?

int* intPtr = &foo();   

2 个答案:

答案 0 :(得分:6)

不,这些都不会延长局部变量的生命周期。 C ++中的 Nothing 会产生这种效果。 C ++中的本地对象一直存在,直到它们被声明的范围结束,故事结束。

乍一看似乎遵循不同规则的唯一规则是:

int foo() {
    return 42;
}

int main() {
    const int& i = foo();
    // here, `i` is a reference to the temporary that was returned from `foo`, and whose lifetime has been extended
}

也就是说, const 引用可以延长分配给它的临时的生命周期。

但是这需要函数返回一个值,而不是一个引用,而被调用者将返回值绑定到一个const引用,这两个都没有在你的代码中完成。

答案 1 :(得分:0)

在任何情况下(不是intVal,不是intRef,而不是intPtr)foo返回后i必然会留下来。

在foo返回后,i之前占用的堆栈上的值可能会随时更改,也可能不会更改。

例如(在某些CPU和O / Ses上),很可能通过对子程序的任何后续调用进行更改,如果发生硬件中断,则可能会更改。