目录
1 问题
2 分析
3 结果
1 问题
项目中有成百上千条目,每个条目有使用QVector容器
比如:
使用QVector<short> mDataBuf 容器,使用append()函数或者resize()函数所占的内存过大,大概有两个G左右,每个条目运行完后mDataBuf.clear()后所占内存无变化
QVector<short> mDataBuf;
mDataBuf.resize(num);
mDataBuf.clear();
2 分析
在Qt中,QVector
是一个动态数组,它负责管理其内部存储的元素的内存。当你调用 resize(num)
时,QVector
会调整其内部存储空间(如果需要的话)以包含至少num
个元素的空间。这些元素默认使用它们类型的默认构造函数进行初始化(对于 short
类型,这通常是0)。
然而,当你调用 clear()
方法时,QVector
会将其内部“大小”(即,你可以通过 size()
方法获取的元素数量)设置为0,但它不会立即释放整个底层内存分配。这是因为动态内存分配和释放是开销较大的操作,而且Qt的设计哲学之一是通过减少不必要的内存分配和释放来提高性能。
因此,当你调用 DataBuf.clear()
后,DataBuf
的内存占用量从逻辑上讲是减少了(因为它不再包含任何有效的 short
值),但从物理内存的角度来看,它可能仍然保持着为num
个 short
值分配的内存空间。这种空间被称为“容量”(capacity),你可以通过 capacity()
方法来查询它。
如果你想要 QVector
释放其不再需要的内存,你可以使用 squeeze()
方法。这个方法会尝试将 QVector
的容量调整为与其当前大小(即元素数量)相匹配,从而可能释放一些不再需要的内存。但请注意,即使你调用了 squeeze()
,Qt 的内存管理器也可能决定保留一些额外的空间以供将来扩展使用,而不是立即将所有多余内存都归还给操作系统。
QVector<short> mDataBuf;
mDataBuf.resize(num);
mDataBuf.clear();
mDataBuf.squeeze();
3 结果
运行完所有条目,程序所占的内存由原来的2个G优化到300M左右