gpt4 book ai didi

c++ - 从返回值 : how does it work? 创建 const 左值引用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:59:59 24 4
gpt4 key购买 nike

我从here中学到了const 引用可以由函数返回值的对象组成。但现在我问自己:应该把这个对象放在哪里,这样它才安全并且不会被 future 函数调用的堆栈覆盖?

考虑这段代码:

#include <iostream>
using namespace std;

struct A{};

A returnsmt(){
int avariable;
cout<<"returnsmt stack: "<<&avariable<<endl;
return A();
}

const A& proxyreturnsmt(){
int avariable;
const A& middle=returnsmt();
cout<<"proxyreturnsmt stack: "<<&avariable<<" A ptr: "<<&middle<<endl;
return middle;
}

int main(){
int avariable;
const A& a=proxyreturnsmt();
cout<<"main stack: "<<&avariable<<" A ptr: "<<&a<<endl;
}

现在,main 知道它将从堆栈的对象创建引用甚至是不可行的,所以诀窍不可能是它传递一个隐藏的指针到空闲堆栈桶它自己的。 g++ 上的这段代码打印:

returnsmt stack: 0x7fff3718bc0c
proxyreturnsmt stack: 0x7fff3718bc28 A ptr: 0x7fff3718bc2f
main stack: 0x7fff3718bc4c A ptr: 0x7fff3718bc2f

所以看起来,如果堆栈向下增长,对象所在的位置实际上就是 proxyreturnsmt 的堆栈。如果在获得此引用后调用,比方说,function_with_big_stack_alloc,那么您怎么就不会遇到麻烦,因此肯定会回收旧的 proxyreturnsmt 堆栈以用于新用途?

最佳答案

程序表现出未定义的行为。在 proxyreturnsmt 中,您将 middle 绑定(bind)到一个临时对象。该临时对象的生命周期只会延长到 middle 超出范围。

然后您返回对middle 的引用;但是它所引用的对象在函数返回时被销毁。因此,在 main 中,您将 a 绑定(bind)到调用 proxyreturnsmt 的结果,a 是一个悬空引用(它所指的对象不再存在)。

当您尝试使用引用(通过获取不再存在的引用对象的地址)时,程序会出现未定义的行为。

关于c++ - 从返回值 : how does it work? 创建 const 左值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10146073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com