假设我有一个 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();
}
此代码崩溃并抛出 std::bad_aloc
异常(QtConsoleApplication1.exe 中 0x7729C41F 处未处理的异常:Microsoft C++ 异常:内存位置 0x0034F5E8 处的 std::bad_alloc。
)在 32 位系统上(因为系统不支持一个进程使用太多 RAM)。
但是,如果我注释行 v->reserve(420000);
和 v->resize(420000);
一切正常。这就是我注意到的方式,如果我调用 v->reserve(42);
和 v->resize(42);
(在将 vector 保留/调整为 420000 个元素之后预先)超出的内存不会被释放。
我还注意到 std::vector
的行为完全相同。
是否可以强制 Qt
也释放内存?如果没有,是否可以通过某种方式自己手动释放它?
最佳答案
除非存在实际的内存压力,否则底层库不执行将分配的内存实际释放回操作系统的工作是有意义的,而是保留它并使用它来满足新的分配(不会导致上下文切换到从内核中获取它)你可能很快就会做出来。
操作系统也是如此。即使应用程序实际上释放了内存,在其他地方实际需要它之前,进行实际回收它的工作是没有意义的(幸运的是,直到进程退出并且它可以对所有内容进行一次批量回收)。
所以,原因是效率。实际释放内存会产生成本,并且没有理由支付成本,直到您真的不得不这样做——在许多情况下永远不会。
关于c++ - QVector(or std::vector) reserve(or resize) down 不释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48466638/