You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

返回局部变量引用的C++代码为何输出随机值?栈变量销毁解析

为什么这段返回局部变量引用的C++代码输出随机值?

先看你的代码:

#include <iostream>

int& GetInt();    
void Print(int& valueToPrint);

int main()
{
    int& myValue = GetInt();
    Print(myValue);
}

int& GetInt()
{
    int x = 9;
    return x;
}

void Print(int& valueToPrint)
{
    std::cout << valueToPrint;
}

你的猜测完全正确,问题核心就出在GetInt()里的局部变量x上:

  • 局部变量x是在函数的栈帧上分配的,当GetInt()执行完毕返回时,这个栈帧会被销毁,x占用的内存空间会被释放,标记为可被后续代码复用。
  • 你在main中拿到的myValue是一个悬空引用——它指向的内存已经不再属于原来的x了。

当调用Print(myValue)读取这个引用指向的内存时,这块内存此时可能已经被其他操作(比如函数返回时的栈清理、后续函数调用的栈数据写入)覆盖,所以你读到的是内存里残留的垃圾值,也就是你看到的32759这类随机整数。

C++标准明确规定,返回局部变量的引用属于未定义行为——程序的结果完全不可预测,可能输出随机值、崩溃,甚至偶尔看起来“正常工作”(比如某次运行中这块内存还没被覆盖),但这种情况完全不可依赖。

如果想让代码按预期输出9,有两种常见的修正方式:

  • 返回值而非引用:将int& GetInt()修改为int GetInt(),这样会返回x的副本,避免悬空引用问题。
  • 使用静态变量:在GetInt()中将x声明为static int x = 9;,静态变量存储在全局数据区,函数退出后不会被销毁,引用会始终有效。

内容的提问来源于stack exchange,提问作者Tobias von Falkenhayn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:20:30