QVector(or std::vector) reserve(or resize) down 不释放内存

QVector(or std::vector) reserve(or resize) down doesn't free memory

假设我有一个 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->reserve(420000);v->resize(420000); 一切正常。这就是我注意到的方式,如果我调用 v->reserve(42);v->resize(42);(在 reserving/resizing 之前向量到 420000 个元素之后)超出的内存不会被释放。

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

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

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

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

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