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看来这是预期的行为:
注意内部数组永远只能得到在列表上的生命大。它永远不会缩小。当一个列表被分配给另一个列表时,内部数组将被析构函数和赋值运算符解除分配。
如果你想取消分配你有几个选项
- 确保调用析构函数(使用删除存储{假设你new'd摆在首位名单},或允许的QList对象走出去的范围)
- 分配一个空单的大名单(认为这将工作)
我记得读一下:
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();
分配它没有指针参与问题。所以你不能删除任何东西。 – alexisdm 2011-09-16 14:00:36
但使用删除,不会我需要将其声明为指针的QList *的memlist ;? –
2010-02-09 16:38:10
@有趣的人,是的,你需要使用新的 – Glen 2010-02-09 16:52:34