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

为何返回已出作用域的栈分配变量引用/指针仍可访问正确值?

为什么返回栈变量的引用/指针后仍能访问到正确值?

这不是“正常运行”,而是未定义行为下的巧合结果,本质上是非常危险的错误写法,具体原因如下:

  • 栈内存的回收逻辑:栈上的变量出作用域时,系统只是移动栈指针,标记这块内存可以被后续操作复用,并不会立刻清除内存里的旧数据。你的示例中,函数返回后还没有任何新的栈操作覆盖这块内存,所以旧值暂时保留,看起来能正常读取。
  • 未定义行为的不可靠性:这种“正常”完全是偶然的,只要后续有任何函数调用、局部变量声明等栈操作,这块内存就会被新数据覆盖,此时再读取指针/引用指向的内容,得到的就是垃圾值,甚至会导致程序崩溃。比如你在main函数的打印语句前加一个简单的函数调用,结果大概率就会变。
  • 编译器的处理:C/C++标准将返回栈变量的引用/指针归为未定义行为,编译器可能会给出警告(比如开启-Wall编译选项),但不会强制报错——因为标准允许编译器对未定义行为做任何处理,包括“刚好能运行”这种极端情况。

你测试的C++示例代码

#include <iostream>

class A {
    
    public:
        int x;
        A(int a) : x(a) {}
};


A& ref_func() {
    A obj {4};
    
    A& ret_val = obj;
    
    return ret_val;
    
}

int main()
{
    A& ret = ref_func();
    
    // shouldn't the object that ref_func is returning a reference to be deallocated?
    // why is it able to be accessed like normal below?

    std::cout << ret.x << std::endl;

    return 0;
}

你测试的C语言示例代码

#include <stdio.h>

int* ref_func() {
    
    int x = 5;
    
    int* y = &x;
    
    return y;
    
}

int main()
{
    int* ret = ref_func();
    printf("%d", *ret);
    
}

内容的提问来源于stack exchange,提问作者dexteriousplinth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:46:08