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

Jac*_*ieg 1 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();
}
Run Code Online (Sandbox Code Playgroud)

此代码在32位系统上崩溃抛出std::bad_alocexception(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释放内存?如果没有,是否有可能以某种方式手动释放它?

Jes*_*uhl 5

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

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

所以,原因是效率.实际上释放内存涉及成本,没有理由支付成本,直到你真的需要 - 在许多情况下永远不会.