MST

星途 面试题库

面试题:C++中函数返回常量引用的基本规则

请简述在C++中函数返回常量引用时,对于返回值对象的生命周期有什么要求?并举例说明如果不满足该要求可能会出现什么问题。
31.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

函数返回常量引用时对返回值对象生命周期的要求

在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的常量引用,静态变量的生命周期贯穿整个程序,所以不会出现悬空引用的问题。