面试题答案
一键面试常见风险
返回局部变量的引用。局部变量在函数结束时会被销毁,此时返回其引用会导致引用指向已释放的内存,产生悬空引用,后续对该引用的使用会导致未定义行为。例如:
int& func() {
int num = 10;
return num;
}
当调用func
函数后,num
变量被销毁,返回的引用指向已无效的内存。
防范措施
- 避免返回局部变量引用:不要返回函数内部定义的局部变量的引用。如果需要返回一个值,可以直接返回值,或者返回在函数外部创建且生命周期足够长的对象的引用。例如:
int func() {
int num = 10;
return num;
}
这样直接返回值,就不会有悬空引用问题。
2. 使用动态分配内存并返回引用:如果确实需要返回一个类似局部变量的对象引用,可以使用动态内存分配(new
),但要注意在合适的地方释放内存,避免内存泄漏。例如:
int* ptr = nullptr;
int& func() {
if (!ptr) {
ptr = new int(10);
}
return *ptr;
}
// 使用后记得释放内存
delete &func();
ptr = nullptr;
这种方式虽然能返回一个类似局部变量的引用,但管理动态内存较为复杂,需谨慎使用。