我对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
是动态的,当元素被删除时它会释放内存。所以要么我缺少某些东西(非常可能),要么它不是动态结构。你有任何想法如何使它工作?
此致
答案 0 :(得分:4)
从docs看来,这是预期的行为:
请注意,内部数组在列表生命周期内只会变大。它永远不会缩小。当一个列表被分配给另一个列表时,析构函数和赋值运算符将释放内部数组。
如果你想取消分配内存,你有几个选择
答案 1 :(得分:1)
我记得读过这个:
http://cplusplus-soup.com/2010/01/05/freedelete-not-returning-memory-to-os/
似乎可能与内存分配/删除行为有关,但我对此并不是100%肯定。
答案 2 :(得分:0)
QList位于QVector(类似于std :: vector)和QLinkedList(类似于std :: list)之间。 QList包含一个指向对象本身的指针数组。
此方案意味着对列表进行排序/重新排序很快,但指针存储在添加项目时会持续增长(类似于向量)。因此,从列表中删除项会释放项目使用的内存,而不释放数组中的指针。
要回收内存,您需要构建一个新列表。 QVector有squeeze(),但在QList中似乎没有。
答案 3 :(得分:-1)
建议将QList用于&lt; 1000个物体。如果需要处理非常大的列表并且需要在删除对象时回收内存,则应考虑使用QLinkedList。
答案 4 :(得分:-2)
尝试使用此代码从QList中释放内存
while( ! memList.isEmpty() )
delete memList.takeFirst();