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

返回类中指针解引用的引用是否属于定义行为?

该C++类实现是否属于定义行为?
#include <iostream>

struct Foo
{
    int* n;
    Foo(){n = new int{};}
    ~Foo(){delete n;}
    int& get()
    {
        int* m = n;
        return *m;
    } 
};

int main()
{
    Foo f;
    std::cout << f.get();
}

这个实现属于定义行为,具体分析如下:

  • Foo的构造函数通过new int{}分配了一块动态内存并初始化为0,析构函数负责在对象生命周期结束时释放这块内存。
  • get()方法里的m是成员指针n的副本,二者指向同一块存活的动态内存;返回的*m引用,本质就是绑定到该内存中int对象的引用。
  • 在main函数的执行流程中,Foo对象f的生命周期完全覆盖了std::cout << f.get()的操作:此时f尚未被析构,n指向的内存也未被释放,返回的引用绑定的是一个存活且有效的int对象,对其进行读取操作完全符合C++标准的定义行为。

需要额外注意:如果出现"返回引用后Foo对象被析构,再通过该引用访问内存"的场景,会触发未定义行为,但当前代码的执行逻辑不存在这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:12:29