不将函数返回值赋给变量的含义 我正在进行一些介绍性的C++练习,其中之一是:在运行这个代码后屏幕上会有什么: int& testMethod (int& a){ int c = a+a; return c; }; int main() { int z = 5; int* y = new int (testMethod(z)); int r = 25; testMethod(r); std::cout<<*y; return 0; } int&testMethod(int&a){ int c=a+a; 返回c; }; int main(){ int z=5; int*y=新的int(testMethod(z)); int r=25; 试验方法(r); 标准::cout

不将函数返回值赋给变量的含义 我正在进行一些介绍性的C++练习,其中之一是:在运行这个代码后屏幕上会有什么: int& testMethod (int& a){ int c = a+a; return c; }; int main() { int z = 5; int* y = new int (testMethod(z)); int r = 25; testMethod(r); std::cout<<*y; return 0; } int&testMethod(int&a){ int c=a+a; 返回c; }; int main(){ int z=5; int*y=新的int(testMethod(z)); int r=25; 试验方法(r); 标准::cout,c++,stack,undefined-behavior,C++,Stack,Undefined Behavior,这是UB作为 第二次调用的testMethod未分配给变量 也许你还没有注意到,但是你一直在忽略返回值(马虎地说)。例如,std::cout如何在你的特定平台上实现自动分配是不相关的。你的代码确实触发UB,不是因为你忽略了testMethod的返回值(顺便说一句,它不是一个方法)但恰恰相反,因为以下行使用它: int* y = new int (testMethod(z)); 问题是,testMethod总是返回一个悬空引用,指向它的局部变量c。使用此引用初始化动态分配的int触发器 可以预见

这是UB作为 第二次调用的testMethod未分配给变量


也许你还没有注意到,但是你一直在忽略返回值(马虎地说)。例如,
std::cout如何在你的特定平台上实现自动分配是不相关的。你的代码确实触发UB,不是因为你忽略了
testMethod
的返回值(顺便说一句,它不是一个方法)但恰恰相反,因为以下行使用它:

int* y = new int (testMethod(z));
问题是,
testMethod
总是返回一个悬空引用,指向它的局部变量
c
。使用此引用初始化动态分配的
int
触发器

可以预见,启用警告(您应该始终这样做)会产生以下结果:

warning: reference to stack memory associated with local variable 'c' returned [-Wreturn-stack-address]

等等,这让我大开眼界。这就是我总是从函数返回值的方式:在函数中创建一个局部变量,将任何计算的结果存储到该变量中,然后返回该变量。你是说这总是UB?那么正确的方法是什么?还是因为
testMethod
返回一个引用inst整数本身的ead?作为旁注,编译器在运行代码时没有产生任何警告(我使用的是Visual Studio 2017),虽然我很确定它们是启用的,因为我一直看到它们。@johnalison如果您返回一个值,那么就没有问题。问题是您返回一个引用。这类似于执行类似于
int*foo(){int*x=new int;delete x;return x;}
。您永远不会编写这样的代码,但这类似于您返回对局部变量的引用时所做的操作(当它离开作用域时会被删除)@user463035818,明白了,谢谢你提供了一个非常清晰的例子。@Johnalison注意,我的评论中的例子没有未定义的行为,只有当你取消引用指针时……砰……类似于返回一个引用。区别在于你不能用一个悬挂的引用做任何有意义的事情(您可以将新地址重新分配给无效指针)
warning: reference to stack memory associated with local variable 'c' returned [-Wreturn-stack-address]