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

C++类中std::set成员是否需要在析构函数中手动释放内存

C++类std::set成员内存释放问题解答

涉及的自定义类代码

class rfdevice_ams2_l9s_cn_qm13341_sub_MIPI_data_ag:public rfdevice_asm2_data
{
public:
  static rfdevice_asm2_data * get_instance();
  std::set<int> Band_Count;
  bool THCH_NRCA = false;
  bool THCH_ENDC = false;
  bool THCH_LTE_LTECA = false;
  bool THCH_GSM = false;
  bool THCH_WCDMA = false;
  bool THCH_CDMA = false;
  int Band_res;
  void Count_Band(rfdevice_asm2_tuning_data_info *tuning_data, int ant_cur,  uint8 scenario);
  void port_cc();
  boolean Get_NR_NRCA(rfdevice_asm2_tuning_data_info *tuning_data, uint8 *port, uint8 scenario);
  boolean Get_LTE_SIGNLE(rfdevice_asm2_tuning_data_info *tuning_data, uint8 *port, uint8 scenario);
  void TECH_Judge(rfdevice_asm2_tuning_data_info *tuning_data, uint8 scenario);
  boolean port_cc(rfdevice_asm2_tuning_data_info *tuning_data, uint8 *port, uint8 scenario);
  boolean get_script(rfdevice_asm2_cfg_params_type *cfg, rfdevice_asm2_settings_type_u *settings);

 ~rfdevice_ams2_l9s_cn_qm13341_sub_MIPI_data_ag(void);  /*  Destructor  */

protected:
  rfdevice_ams2_l9s_cn_qm13341_sub_MIPI_data_ag(void);  /*  Constructor  */

private:
  static rfdevice_asm2_data *rfdevice_ams2_l9s_cn_qm13341_sub_data_ptr;
};

核心问题

C++类中使用set容器作为成员变量时是否需要手动释放内存?例如上述代码中的std::set<int>类型成员Band_Count,是否需要在类的析构函数中编写额外逻辑释放其占用的内存?

解答

  • 针对给出的代码场景,完全不需要在析构函数中编写额外逻辑释放Band_Count的内存。
  • 核心原因是std::set属于C++标准库实现的RAII(资源获取即初始化)类型,自身已经封装了完整的内存管理逻辑:当std::set对象本身生命周期结束时,它的析构函数会自动执行,清理内部存储的所有int元素、维护的红黑树结构占用的全部堆内存,不需要外部手动调用释放接口。
  • 代码中Band_Count是类的值类型成员,不是手动new出来的堆对象、也不是指向set的指针:当外层类对象走析构流程时,C++语言规则会保证自动调用所有非静态成员的析构函数,Band_Count的内存会被自动回收,不会产生泄漏。

特殊场景提醒:只有当类内的set成员是你手动在堆上分配的指针类型(比如声明为std::set<int>* Band_Count,且在代码中通过new动态创建了set实例)时,才需要在析构函数中手动delete该指针完成释放。当前的值类型成员写法不存在这个问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:36:51