从按值返回创建常量左值引用:它是如何工作的
creating const lvalue-reference from return by value: how does it work?
>我从这里了解到,常量引用可以从函数的值返回的对象中进行。但是现在我问自己:把这个对象放在哪里,这样它就是安全的,不会被未来的函数调用堆栈覆盖?
请考虑以下代码:
#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
绑定到临时对象。 该临时对象的生存期仅延长到middle
超出范围。
然后返回对 middle
的引用;但是当函数返回时,它所引用的对象被销毁。 因此,在main
中,您将a
绑定到调用proxyreturnsmt
的结果,a
是一个悬空引用(它所引用的对象不再存在)。
当您尝试使用引用(通过获取不再存在的引用对象的地址)时,程序将显示未定义的行为。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?