面试题答案
一键面试#include <iostream>
// 错误示例
int& wrongFunction() {
int localVar = 10;
return localVar;
}
// 正确示例
class MyClass {
public:
int localVar;
MyClass(int value) : localVar(value) {}
};
MyClass& correctFunction() {
static MyClass obj(10);
return obj;
}
错误原因
在wrongFunction
中,localVar
是一个局部变量,当函数执行结束时,该局部变量的生命周期结束,其占用的内存会被释放。返回对该局部变量的引用,就会导致引用指向一块已经被释放的内存,这是一种未定义行为。
修改方法
- 使用静态局部变量:如
correctFunction
中,定义了一个静态局部对象obj
。静态局部变量的生命周期贯穿整个程序运行期间,函数结束时不会被销毁,所以返回其引用是安全的。 - 使用堆内存:在函数内动态分配内存(例如使用
new
),并返回指向该内存的引用。但需要注意,调用者需要负责释放内存,以避免内存泄漏。例如:
int* createInt() {
return new int(10);
}
调用者使用完后需要delete
释放内存:
int* ptr = createInt();
// 使用ptr
delete ptr;
但这种方式返回的是指针,不是引用。若要返回引用,可结合类来管理动态分配的内存,通过重载operator&
返回引用:
class IntHolder {
private:
int* data;
public:
IntHolder(int value) {
data = new int(value);
}
~IntHolder() {
delete data;
}
int& operator&() {
return *data;
}
};
IntHolder& createIntHolder() {
static IntHolder holder(10);
return holder;
}
这样调用者可以直接获取到动态分配内存中数据的引用,并且由类来管理内存释放。