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
相关产品推荐
相关产品推荐

