QList 中的动态内存

Posted

技术标签:

【中文标题】QList 中的动态内存【英文标题】:dynamic memory in QList 【发布时间】:2011-01-14 21:29:20 【问题描述】:

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

问候

【问题讨论】:

【参考方案1】:

试试这段代码从 QList 中释放内存

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

【讨论】:

问题中不涉及指针。所以你不能删除任何东西。【参考方案2】:

QList 推荐用于

【讨论】:

【参考方案3】:

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

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

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

    确保调用了析构函数(使用 delete 假设您首先新建了列表,或者允许 QList 对象超出范围) 为您的大列表分配一个空列表(认为这会起作用)

【讨论】:

但是要使用delete,是不是需要声明为指针QList * memList;?【参考方案4】:

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

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

要回收内存,您需要构建一个新列表。 QVector 有squeeze(),但QList 中似乎没有。

【讨论】:

【参考方案5】:

我记得读过这篇文章:

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

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

【讨论】:

以上是关于QList 中的动态内存的主要内容,如果未能解决你的问题,请参考以下文章

c++中的动态内存管理

C语言中的动态内存分配的用法举例

QList介绍(QList比QVector更快,这是由它们在内存中的存储方式决定的。QStringList是在QList的基础上针对字符串提供额外的函数。at()操作比操作符[]更快,因为它不需要深度

在 C++ 中的 2D 动态内存分配数组中释放分配的内存

解析PHP中的内存管理,PHP动态分配和释放内存

附加到动态内存中的数组