【问题标题】:QVector(or std::vector) reserve(or resize) down doesn't free memoryQVector(或std :: vector)保留(或调整大小)不会释放内存
【发布时间】:2018-07-06 02:31:02
【问题描述】:

假设我有一个QVector,我为 420000 个元素调用 QVector::reserve。在那之后,我再次为 42 个元素调用 QVector::reserve。我注意到的是,在这样做之后,该进程仍然为这 420000 个元素分配了内存。为什么当我将QVector 大小缩小到 42 时,内存没有被释放?

取以下代码:

#include <QCoreApplication>
#include <QVector>
#include <QDebug>

typedef QVector<QPointF> PointVec;
typedef QList<PointVec*> PointVecList;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "Processing...";

    PointVecList list;

    for (int i = 0; i < 4200; i++) {
        PointVec *v = new PointVec();

        v->reserve(420000);
        v->resize(420000);

        v->reserve(42);
        v->resize(42);

        list.append(v);
    }

    qDebug() << "End of processing...";

    return a.exec();
}

此代码在 32 位系统上抛出 std::bad_aloc 异常(Unhandled exception at 0x7729C41F in QtConsoleApplication1.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0034F5E8.) 崩溃(因为系统不支持一个进程使用太多 RAM)。

但是,如果我评论行 v-&gt;reserve(420000);v-&gt;resize(420000); 一切正常。这就是我注意到,如果我调用 v-&gt;reserve(42);v-&gt;resize(42);(在预先将向量保留/调整为 420000 个元素之后)超出的内存不会被释放。

我还注意到std::vector 的行为完全相同。

是否可以强制Qt 也释放内存?如果没有,是否有可能以某种方式手动释放它?

【问题讨论】:

  • 为什么你希望reserve(42) 释放内存?它只需要确保有足够的空间,而不是没有足够的空间
  • 你可以试试std::vector::shrink_to_fit,但它没有约束力。
  • @tobi303 换句话说,我想保留足够的内存来对向量进行一些操作。在我进行操作后,我确定向量需要多少内存,所以我需要将进程保持在最低内存使用量......关于如何做到这一点的任何提示?
  • @FrançoisAndrieux 你说的it's non-binding是什么意思?
  • a vector 确实为您管理其内存(在很大程度上),如果您需要完全控制,我会求助于动态分配的 c 数组

标签: c++ qt memory-management stl qvector


【解决方案1】:

除非存在实际的内存压力,否则底层库不执行将分配的内存实际释放回操作系统的工作,而是保留它并使用它来满足新的分配(不会导致上下文切换到从内核中获取),无论如何你可能很快就会做出来。

操作系统也是如此。即使应用程序实际上释放了内存,在其他地方实际需要它之前进行实际回收它的工作也是没有意义的(幸运的是,它永远不会直到进程退出并且它可以对所有内容进行一次批量回收)。

所以,原因是效率。实际释放内存是有成本的,在您真的必须这样做之前,没有理由支付成本 - 在许多情况下永远不会。

【讨论】:

    猜你喜欢
    • 2014-11-19
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2012-03-24
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多