首页 文章

返回对局部变量的引用[重复]

提问于
浏览
7

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

即使知道由于以下剪辑而发生的事情,理解它是如何发生也会有所帮助 . 接下来是四个问题

鉴于:

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

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

int  intVal = foo();

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

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

int& intRef = foo();

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

第四个问题 - 当intPtr在范围内时, local i 会不停?

int* intPtr = &foo();

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引用,这两个都没有在你的代码中完成 .

  • 0

    在任何情况下(不是intVal,而不是intRef,而不是intPtr)在foo返回后必然会出现 i .

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

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

相关问题