QList中的动态内存

问题描述:

我对QT没有多少经验,今天出现这个问题。QList中的动态内存

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是动态的,当元素被移除时它会释放内存。所以要么我错过了一些东西(非常可能),或者它不是动态结构。你有什么想法如何使它工作?

问候

docs看来这是预期的行为:

注意内部数组永远只能得到在列表上的生命大。它永远不会缩小。当一个列表被分配给另一个列表时,内部数组将被析构函数和赋值运算符解除分配。

如果你想取消分配你有几个选项

  1. 确保调用析构函数(使用删除存储{假设你new'd摆在首位名单},或允许的QList对象走出去的范围)
  2. 分配一个空单的大​​名单(认为这将工作)
+0

但使用删除,不会我需要将其声明为指针的QList *的memlist ;? – 2010-02-09 16:38:10

+0

@有趣的人,是的,你需要使用新的 – Glen 2010-02-09 16:52:34

我记得读一下:

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

现在看来,这可能是内存分配/删除行为做的,但我不是100%肯定。

的QList是中途之间QVector(类似于标准::向量)和QLinkedList(类似于std :: list)。 QList拥有一个指向对象本身的指针数组。

该方案意味着对列表进行排序/重新排序的速度很快,但随着项目的添加(类似于矢量),指针存储会不断增大。因此,从列表中删除项目可释放项目使用的内存,但不会释放阵列中的指针。

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

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

从QList作试试这个代码来释放内存

while(! memList.isEmpty()) 
    delete memList.takeFirst(); 
+0

分配它没有指针参与问题。所以你不能删除任何东西。 – alexisdm 2011-09-16 14:00:36