QVector(或std :: vector)保留(或调整大小)down并不释放内存

时间:2018-01-26 17:35:40

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

假设我有QVector并且我为420000个元素调用了QVector :: reserve。在那之后,我再次给QVector::reserve打了42个元素。我注意到,在执行此操作后,该进程仍然为这些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);(在事先保留/调整向量大小为420000个元素之后),超出内存并没有被释放。

我还注意到std::vector表现完全一样。

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

1 个答案:

答案 0 :(得分:5)

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

操作系统也是如此。即使应用程序实际释放内存,在实际需要其他地方之前完成回收它的工作是没有意义的(幸运的是,直到进程退出并且它只能对所有内容进行单个批量回收)。< / p>

所以,原因是效率。实际上释放内存涉及成本,并且没有理由支付成本,直到真正必须 - 这在很多情况下永远不会。