【问题标题】:returning references to local variable [duplicate]返回对局部变量的引用[重复]
【发布时间】:2012-12-20 20:58:19
【问题描述】:

可能重复:
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;
}

并且知道在下面对 local i 的引用被取消引用到分配给 intVal 的 temp 并且 local i 在末尾消失foo()

int  intVal = foo();

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

第二个问题 - 仅此一项就使得 local i 在 intRef 处于范围内时仍然存在?

int& intRef = foo();

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

第四个问题 - local iintPtr 在范围内时是否仍然存在?

int* intPtr = &foo();   

【问题讨论】:

  • 知道这里发生了什么毫无意义。 FWIW,它从不停留,并且在第一个中它停留的时间不够长,无法发生任何事情。
  • 由于完全重复而关闭?我主要关心的是问题 1 和 3,它们涉及 LHS 的上下文,以确定如何处理 RHS(取消引用与否)。 “完全重复”甚至都没有涉及到这个问题。

标签: c++ reference


【解决方案1】:

不,这些都不会延长局部变量的生命周期。 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 引用,这两者都没有在您的代码中完成。

【讨论】:

  • "要求函数返回一个值,而不是一个引用"
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-01-19
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多