3

我对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是动态的,当元素被删除时它会释放内存。所以要么我遗漏了一些东西(很可能),要么它不是动态结构。你有什么想法如何让它发挥作用吗?

问候

4

5 回答 5

4

文档看来,这是预期的行为:

请注意,内部数组只会在列表的生命周期内变得更大。它永远不会缩小。当一个列表分配给另一个列表时,内部数组由析构函数和赋值运算符释放。

如果你想取消分配内存,你有几个选择

  1. 确保调用了析构函数(使用 delete {假设您首先新建了列表},或者允许 QList 对象超出范围)
  2. 为您的大列表分配一个空列表(认为这会起作用)
于 2010-02-09T16:31:02.347 回答
1

我记得读过这个:

http://cplusplus-soup.com/2010/01/05/freedelete-not-returning-memory-to-os/

似乎这可能与内存分配/删除行为有关,但我对此不是 100% 确定的。

于 2010-02-09T16:28:02.867 回答
0

QList 介于QVector(类似于 std::vector)和QLinkedList(类似于 std::list)之间。QList 包含一个指向对象本身的指针数组。

这种方案意味着对列表进行排序/重新排序很快,但指针存储会随着项目的添加而不断增长(类似于向量)。因此,从列表中删除项目会释放项目使用的内存,但不会释放数组中的指针。

要回收内存,您需要构造一个新列表。QVector 有挤压(),但 QList 中似乎不存在。

于 2010-02-09T16:33:15.917 回答
-1

QList 推荐用于< 1000 个对象的列表。如果您需要处理非常大的列表并且需要在删除对象时回收内存,您应该考虑使用 QLinkedList。

于 2010-07-02T04:59:37.917 回答
-2

尝试使用此代码从 QList 中释放内存

while( ! memList.isEmpty() )
    delete memList.takeFirst();
于 2011-09-15T04:16:50.750 回答