Qt内存释放:含QList对象指针成员的类delete后是否会内存泄漏?
问题解答
核心结论
调用delete request;时,仅会释放request对象自身的内存,type1、type2、type3、type4这些通过new创建的GetVariableDataType对象不会被自动释放,会产生内存泄漏。
原因分析
- QList容器存储的是裸指针,它的析构函数只会清理容器内部用于存储指针的内存空间,不会主动调用
delete去释放指针指向的堆对象。 GetVariablesRequest的默认析构函数没有遍历getVariableData列表、释放每个指针指向对象的逻辑,因此这些对象的内存会一直留在堆中无法回收。
解决方法
方法一:手动在析构函数中释放内存
修改GetVariablesRequest的析构函数,利用Qt提供的qDeleteAll工具函数遍历列表释放所有对象:
GetVariablesRequest::~GetVariablesRequest() { qDeleteAll(getVariableData); // 遍历列表,delete每个指针指向的对象 getVariableData.clear(); // 清空列表,避免悬空指针(可选,但更严谨) }
这样当delete request;时,会先调用这个析构函数,自动释放所有GetVariableDataType对象的内存。
方法二:使用智能指针替代裸指针
改用Qt的QSharedPointer或C++标准库的std::unique_ptr来管理对象生命周期,无需手动调用delete:
// 修改类定义 class GetVariablesRequest { public: GetVariablesRequest(); ~GetVariablesRequest(); QList<QSharedPointer<GetVariableDataType>> getVariableData; }; // 使用方式 GetVariablesRequest* request = new GetVariablesRequest(); auto type1 = QSharedPointer<GetVariableDataType>::create(); auto type2 = QSharedPointer<GetVariableDataType>::create(); request->getVariableData.append(type1); request->getVariableData.append(type2);
当request被销毁时,QList会自动销毁内部的所有QSharedPointer,而QSharedPointer会在引用计数为0时自动释放指向的GetVariableDataType对象。
额外注意点
你当前的使用代码存在越界风险:初始状态下getVariableData是空列表,直接通过request->getVariableData[0]赋值会触发未定义行为(大概率崩溃)。正确的添加元素方式应该用append或push_back:
// 正确写法 request->getVariableData.append(type1); request->getVariableData.append(type2); request->getVariableData.append(type3); request->getVariableData.append(type4);
内容的提问来源于stack exchange,提问作者Fabrizio Belloni
相关产品推荐
相关产品推荐

