QList 中的动态内存
Posted
技术标签:
【中文标题】QList 中的动态内存【英文标题】:dynamic memory in QList 【发布时间】:2011-01-14 21:29:20 【问题描述】:我对QT没有太多经验,今天就出现了这个问题。
QList<int> memList;
const int large = 100000;
getchar();
for (int i=0; i<large; i++)
memList.append(i);
cout << memList.size() << endl;
getchar();
for (int i=0; i<large; i++)
memList.removeLast();
cout << memList.size() << endl;
getchar();
在第一次循环后,当我检查内存使用情况时,它会随着新元素附加到memList
而上升,但在第二次循环中删除它们后,内存使用情况保持在同一水平。我认为QList
是动态的,当元素被删除时它会释放内存。所以要么我遗漏了一些东西(很可能),要么它不是动态结构。你有什么想法可以让它发挥作用吗?
问候
【问题讨论】:
【参考方案1】:试试这段代码从 QList 中释放内存
while( ! memList.isEmpty() )
delete memList.takeFirst();
【讨论】:
问题中不涉及指针。所以你不能删除任何东西。【参考方案2】:QList 推荐用于
【讨论】:
【参考方案3】:从docs看来,这是预期的行为:
请注意,内部数组只会在列表的生命周期内变得更大。它永远不会缩小。当一个列表被分配给另一个列表时,内部数组由析构函数和赋值运算符释放。
如果你想取消分配内存,你有几个选择
-
确保调用了析构函数(使用 delete 假设您首先新建了列表,或者允许 QList 对象超出范围)
为您的大列表分配一个空列表(认为这会起作用)
【讨论】:
但是要使用delete,是不是需要声明为指针QListQList 介于QVector(类似于 std::vector)和QLinkedList(类似于 std::list)之间。 QList 包含一个指向对象本身的指针数组。
这种方案意味着对列表进行排序/重新排序很快,但指针存储会随着项目的添加而不断增长(类似于向量)。因此,从列表中删除项目会释放项目使用的内存,但不会释放数组中的指针。
要回收内存,您需要构建一个新列表。 QVector 有squeeze(),但QList 中似乎没有。
【讨论】:
【参考方案5】:我记得读过这篇文章:
http://cplusplus-soup.com/2010/01/05/freedelete-not-returning-memory-to-os/
这似乎与内存分配/删除行为有关,但我对此不是 100% 确定。
【讨论】:
以上是关于QList 中的动态内存的主要内容,如果未能解决你的问题,请参考以下文章
QList介绍(QList比QVector更快,这是由它们在内存中的存储方式决定的。QStringList是在QList的基础上针对字符串提供额外的函数。at()操作比操作符[]更快,因为它不需要深度