MST

星途 面试题库

面试题:C++函数返回引用的基本生命周期理解

请写出一个C++函数,该函数返回一个局部变量的引用,并解释为什么这样做是错误的,如何修改使其正确返回引用。
31.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#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是一个局部变量,当函数执行结束时,该局部变量的生命周期结束,其占用的内存会被释放。返回对该局部变量的引用,就会导致引用指向一块已经被释放的内存,这是一种未定义行为。

修改方法

  1. 使用静态局部变量:如correctFunction中,定义了一个静态局部对象obj。静态局部变量的生命周期贯穿整个程序运行期间,函数结束时不会被销毁,所以返回其引用是安全的。
  2. 使用堆内存:在函数内动态分配内存(例如使用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;
}

这样调用者可以直接获取到动态分配内存中数据的引用,并且由类来管理内存释放。