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

问候

【问题讨论】:

    标签: qt qt4 dynamic-memory-allocation qlist


    【解决方案1】:

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

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

    【讨论】:

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

    QList 推荐用于

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 但是要使用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% 确定。

        【讨论】:

          猜你喜欢
          • 2011-01-17
          • 2012-11-13
          • 2011-06-18
          • 2013-06-24
          • 2015-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多