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

返回托管内存的引用是否属于不良编程实践?

这段C++代码的悬空引用问题分析

先看你给出的代码:

class Clazz {
 private:
  std::shared_ptr<int> something;

 public:
  Clazz() : something(std::make_shared<int>(0)) {}

  int &getSomething() {
    return *something;
  }
};

为什么会出现悬空引用?

  • getSomething()返回的是std::shared_ptr<int>所管理对象的引用。一旦Clazz对象被析构,或者内部的something被重新赋值指向新对象,原来的int对象会因为shared_ptr的引用计数归0而被释放。此时之前通过getSomething()获取的引用就会指向已经被回收的内存,成为悬空引用。
  • 这和悬空指针的风险完全一致,只是载体是引用而非指针。引用虽然不能被重新赋值,但它指向的对象依然可能被销毁,导致后续访问触发未定义行为。

触发问题的示例场景

比如这段代码就会引发风险:

int* ptr = nullptr;
{
  Clazz temp_obj;
  ptr = &temp_obj.getSomething();
} // temp_obj析构,something管理的int被释放
// 此时ptr指向已释放内存,访问*ptr属于未定义行为

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:40:59