7

可能重复:
返回局部变量或临时变量的地址
局部变量的内存是否可以在其范围之外访问?

即使知道以下剪辑的结果会发生什么,也有助于了解它是如何发生的。接下来是四个问题。

鉴于:

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

并且知道在下面对名为 i 的本地的引用被取消引用到分配给 intVal 的 temp 中,并且本地 i在foo()的末尾消失

int  intVal = foo();

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

第二个问题 - 仅这一点就让本地 i在 intRef 范围内时留下来?

int& intRef = foo();

第三个问题 - 波纹管intPtr获取本地 i的地址。那么,编译器是否使用赋值的上下文并决定在获取引用地址之前不取消引用来获取值(而不是说获取包含取消引用值的临时地址)?

第四个问题 -当intPtr在范围内时,本地 i是否会留下来?

int* intPtr = &foo();   
4

2 回答 2

6

不,这些都不会延长局部变量的生命周期。C++ 中没有任何东西会产生这种效果。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 引用,这两者都没有在您的代码中完成。

于 2012-12-20T21:03:26.163 回答
0

在任何情况下(不是 intVal、不是 intRef 和不是 intPtr)都不i一定会在 foo 返回后继续存在。

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

例如(在某些 CPU 和 O/Ses 上),它可能会被任何后续调用子程序更改,并且可能会在发生硬件中断时更改。

于 2012-12-20T21:06:52.777 回答