【发布时间】:2011-03-16 04:51:37
【问题描述】:
一个我不确定答案的基本问题。跟随功能有效吗?
std::vector<int> & test_function() {
std::vector<int> x;
// do whatever
return x;
}
如果是这样,为什么?函数返回后程序不应该从堆栈中删除 x 吗?谢谢。
【问题讨论】:
一个我不确定答案的基本问题。跟随功能有效吗?
std::vector<int> & test_function() {
std::vector<int> x;
// do whatever
return x;
}
如果是这样,为什么?函数返回后程序不应该从堆栈中删除 x 吗?谢谢。
【问题讨论】:
行为未定义。您不应该返回对局部变量的引用。
【讨论】:
函数格式正确(语法正确),但函数一返回,返回的引用无效,不能使用。
澄清一下:有问题的代码不调用任何未定义的行为。只要您不使用返回值,您就可以安全地调用此函数,例如,这是有效的:
test_function(); // ok
但是,如果您尝试使用返回值(即,用它初始化另一个引用或将所指对象复制到另一个对象中),那么您将调用未定义的行为,因为所指对象(对象 x)的生命周期将具有结束(函数返回时x会被销毁,因为它是一个自动变量):
std::vector<int>& vec = test_function(); // undefined
std::vector<int> vec = test_function(); // undefined
【讨论】:
mov esp,ebp; pop ebp; 本地堆栈帧不受干扰)。然而,析构函数被调用并且数据可以被操纵/改变。然而,这是错误的做法,并且预测会发生什么,即使在一个地方准确猜测也是不可移植的。
是的,它是有效的,但是如果你尝试使用返回的值,你会得到未定义的行为。
【讨论】:
您不能返回对局部变量的引用,原因与不能返回指向局部变量的指针的原因相同,因为从函数返回时,这些局部变量被释放,因此引用或指针变得无效。
【讨论】: