面试题答案
一键面试函数返回常量引用时对返回值对象生命周期的要求
在C++ 中,当函数返回常量引用时,返回值对象的生命周期必须长于该引用的使用范围。也就是说,返回的引用所指向的对象不能是函数内部的局部变量(包括局部对象、局部数组等),因为函数结束时,局部变量的生命周期结束,会被销毁。如果返回指向局部变量的引用,就会导致悬空引用,使用该引用时会引发未定义行为。
不满足要求可能出现的问题示例
#include <iostream>
const int& badFunction() {
int localVar = 10;
return localVar;
}
int main() {
const int& result = badFunction();
std::cout << "Result: " << result << std::endl;
// 此时localVar已经被销毁,result是悬空引用,这里的输出结果是未定义的
return 0;
}
在上述代码中,badFunction
函数返回了对局部变量localVar
的常量引用。当函数结束,localVar
被销毁,在main
函数中使用result
时,它指向的是已销毁的对象,这会导致未定义行为,比如输出错误的值,甚至程序崩溃。
正确的做法可以是返回静态变量或动态分配(使用new
)的对象的引用(但使用new
时要注意内存管理,防止内存泄漏),示例如下:
#include <iostream>
const int& goodFunction() {
static int staticVar = 10;
return staticVar;
}
int main() {
const int& result = goodFunction();
std::cout << "Result: " << result << std::endl;
return 0;
}
这里goodFunction
返回了对静态变量staticVar
的常量引用,静态变量的生命周期贯穿整个程序,所以不会出现悬空引用的问题。