假设我有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
释放内存?如果没有,是否有可能以某种方式手动释放它?
答案 0 :(得分:5)
除非存在实际的内存压力,否则底层库无法将已分配的内存实际释放回操作系统,而是保留它并使用它来满足新的分配(不会导致上下文切换)无论如何,你很快就可以从内核中获取它。
操作系统也是如此。即使应用程序实际释放内存,在实际需要其他地方之前完成回收它的工作是没有意义的(幸运的是,直到进程退出并且它只能对所有内容进行单个批量回收)。< / p>
所以,原因是效率。实际上释放内存涉及成本,并且没有理由支付成本,直到真正必须 - 这在很多情况下永远不会。