繁体   English   中英

当您从 c++ function 返回引用时会发生什么?

[英]What happens when you return a reference from a c++ function?

问题不在于为什么以及何时应该使用它。 我想知道在低级别到底发生了什么,因为我们得到了非常奇怪的结果。

例如,当您像这样使用它时很清楚:

int& func(int& num) {
    ++num;
    return num;
}

这里我们通过引用传递一个变量,改变它,并返回一个对同一个变量的新引用。

但是如果我们这样做会发生什么?

int& func(int num) {
    ++num;
    return num;
}

当 function func完成时,变量num不再存在。 C++ 不允许在没有使用变量初始化的情况下创建引用。 但是在这种情况下,编译和执行 go 都没有错误。 例如,如果我们不初始化int ,我们会得到随机行为:

int num;
std::cout << num; // gives 6422352 or sth like that

但是如果我们用上面的 function 初始化它:

int num1(1);
int num2(func(num1));
cout << num2; // console freezes for a second or two, and execution stops, without any errors

所以我一直在想:

  1. 为什么我们没有收到返回对不存在的 object 的引用的编译错误?
  2. 这是什么分配给num2
  3. 为什么它不会导致任何执行错误,而只是停止程序?

从 function返回对局部变量的引用并没有错。 但是,使用该引用会导致未定义的行为。

好吧,我用g++ version 5.4.0编译了你的代码。

所以我一直在想:

  1. 为什么我们没有收到返回对不存在的 object 的引用的编译错误?

编译器不会给出错误,但会给出警告。

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)
               ^

此外,您不会返回对不存在的 object 的引用。 当您返回参考时, object (或者更确切地说是int )存在并且没有超出范围。 一旦执行了return语句,它就会超出范围

这就是编译器编译代码并给出警告的原因。

  1. 分配给 num2 的是什么?
  1. 为什么它不会导致任何执行错误,而只是停止程序?

现在,当我执行程序时,我每次都会得到Segmentation fault (没有任何输出)。 快速使用gdb告诉我这条线

int num2(func(num1));

main()中是罪魁祸首。 这是我的程序崩溃的地方。

==================================================== ==

TLDR;

正如对您的问题的评论和@Hi - love SO 的回答中所述,很明显,返回对局部变量的引用没有任何问题。

可能您只是在使用旧的编译器,当您的程序进入未定义的行为领域时,它能够以某种方式为您提供 output。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM