QList中的动态内存

时间:2010-02-09 16:22:24

标签: qt qt4 dynamic-memory-allocation qlist

我对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是动态的,当元素被删除时它会释放内存。所以要么我缺少某些东西(非常可能),要么它不是动态结构。你有任何想法如何使它工作?

此致

5 个答案:

答案 0 :(得分:4)

docs看来,这是预期的行为:

  

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

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

  1. 确保调用析构函数(使用delete {假设您首先在列表中新建},或允许QList对象超出范围)
  2. 将一个空列表分配给您的大列表(认为这样可行)

答案 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();