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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:43:35