C++ 从c+;返回引用时会发生什么+;功能?
问题不在于为什么以及何时应该使用它。我想知道在低级阶段到底发生了什么,因为我们得到了非常奇怪的结果 例如,当您这样使用它时,很明显:C++ 从c+;返回引用时会发生什么+;功能?,c++,memory,reference,C++,Memory,Reference,问题不在于为什么以及何时应该使用它。我想知道在低级阶段到底发生了什么,因为我们得到了非常奇怪的结果 例如,当您这样使用它时,很明显: int&func(int&num){ ++num; 返回num; } 在这里,我们通过引用传递一个变量,对其进行更改,然后返回对同一变量的新引用 但如果我们这样做会发生什么 int&func(int-num){ ++num; 返回num; } 函数func完成后,变量num不再存在。C++不允许创建引用而不使用变量初始化它们。但在这种情况下,编译和执行都不会出
int&func(int&num){
++num;
返回num;
}
在这里,我们通过引用传递一个变量,对其进行更改,然后返回对同一变量的新引用
但如果我们这样做会发生什么
int&func(int-num){
++num;
返回num;
}
函数func
完成后,变量num
不再存在。C++不允许创建引用而不使用变量初始化它们。但在这种情况下,编译和执行都不会出错。例如,如果我们不初始化int
,我们会得到随机行为:
int-num;
std::cout从函数返回对局部变量的引用没有错。但是,使用该引用会导致未定义的行为。好吧,我用g++5.4.0版编译了您的代码
所以我一直在想:
为什么我们没有得到一个编译错误,返回对一个不存在的对象的引用
编译器不会给出错误,但会给您一个警告
sampe.cpp: In function ‘int& func(int)’:
sampe.cpp:6:15: warning: reference to local variable ‘num’ returned [-Wreturn-local-addr]
int& func(int num)
^
此外,您不会返回对不存在的对象的引用。当您返回引用时,对象(或者更确切地说是int
)存在并且不在范围之外。一旦执行了return
语句,它就超出了范围
这就是编译器编译代码并给出警告的原因
sampe.cpp: In function ‘int& func(int)’:
sampe.cpp:6:15: warning: reference to local variable ‘num’ returned [-Wreturn-local-addr]
int& func(int num)
^
分配给num2的是什么
为什么它不会导致任何执行错误,而只是停止程序
现在,当我执行程序时,每次都会出现分段错误
(没有任何输出)。快速使用gdb
告诉我
int num2(func(num1));
在main()
中是罪魁祸首。这就是我的程序崩溃的地方
====================================================
TLDR强>
正如@Hi-love SO对您的问题和答案的评论中所述,很明显,返回对局部变量的引用没有什么错
可能您只是在使用一个旧的编译器,当您的程序进入未定义的行为区域时,它能够以某种方式为您提供输出。您在@S.Ellis中。可以使用相同的“hotel room”参数作为参考,在这方面没有区别。@S.Ellis如果有帮助,编译器通常将引用实现为机器地址(就像指针一样)。所以返回的是变量以前占用的地址。引用绝对会占用内存,在某些情况下,它们可能会优化为原始变量。基本上可以把引用看作是非空的PoTITIT,在编写和推理C++代码时,将它们看作别名是有用的。当编译后的代码在实际硬件上运行时,它们通常作为指针实现,因为地址是对象的“名称”。在这种情况下,对象的名称在对象被销毁后仍然存在,并且如果该对象仍然活着,则使用该引用(或指针)是一个错误。有人可能会说,返回您无法以保存方式使用的内容是错误的。@Unlikus您可以这样说,当然。但是返回那个悬而未决的引用和实际尝试使用它之间有很大的区别。仅返回它是有效的,但使用它会导致整个程序无效。