【问题标题】:QList memory deallocationQList 内存释放
【发布时间】:2011-01-17 11:48:49
【问题描述】:

我在使用 QList 后尝试释放内存,但它似乎无法正常工作。 这是我的代码:

QList<double> * myList;
myList = new QList<double>;

double myNumber;

cout << "CP1" << endl;
getchar();  // checkpoint 1

for (int i=0; i<1000000; i++)
{
    myNumber = i;
    myList->append(myNumber);
    cout << myList->size() << endl;
}

cout << "CP2!" << endl;
getchar();  // checkpoint 2


for (int i=999999; i>0; i--)
{
    myList->removeLast();
    cout << myList->size() << endl;
}

cout << "CP3!" << endl;
getchar();  // checkpoint 3

delete myList;

cout << "CP4!" << endl;
getchar();  // checkpoint 4

内存使用情况:

  • CP1:460k
  • CP2:19996k
  • CP3:19996k
  • CP4:16088k

所以看起来尽管删除了元素并删除了myList,但仍然使用了大部分内存。我相信有办法处理它,但我找不到它。

提前感谢您的帮助。

帕维尔

【问题讨论】:

标签: qt qt4 dynamic-memory-allocation qlist memory-management


【解决方案1】:

内存管理器不需要释放程序分配的内存。您的释放没有问题。

【讨论】:

  • 嗯,但似乎一开始程序只需要 460k,在创建 myList、添加元素、删除元素和删除 myList 之后,它需要 16088k。那么超过15000k在哪里?
  • 您的程序会在您追加新元素时分配额外的内存,然后在您删除所有元素时释放此内存。但是内存管理器会保留这块内存并且不会将其返回给操作系统。
  • 很好,如果其他应用程序需要这部分内存,它是否可供它使用,或者内存管理器只为原始应用程序保留它?有什么方法可以强制将其返回给操作系统?
  • 这不是您应该担心的事情。如果系统内存不足,它可能会从您的程序中释放它并将其用于需要内存的程序。
【解决方案2】:

QList 是一个基于数组的列表。数组会自动扩展,但不会自动收缩。从列表中删除元素不会影响数组的大小。

要将数组修剪到实际大小,请创建一个新的 QList 并将内容添加到其中。然后删除原来的列表。

不幸的是,似乎没有方便的方法来执行此操作,例如 .NET 中的 List.TrimExcess()。

【讨论】:

    猜你喜欢
    • 2015-11-02
    • 2014-02-18
    • 2011-05-10
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2013-12-05
    • 2015-04-22
    相关资源
    最近更新 更多