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也是如此。即使应用程序实际上释放了内存,在其他地方实际需要它之前,进行实际回收它的工作是没有意义的(幸运的是,直到进程退出并且它可以对所有内容进行一次批量回收)。
所以,原因是效率。实际释放内存会产生成本,并且没有理由支付成本,直到您 真的 必须这样做 - 在许多情况下永远不会。
假设我有一个 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也是如此。即使应用程序实际上释放了内存,在其他地方实际需要它之前,进行实际回收它的工作是没有意义的(幸运的是,直到进程退出并且它可以对所有内容进行一次批量回收)。
所以,原因是效率。实际释放内存会产生成本,并且没有理由支付成本,直到您 真的 必须这样做 - 在许多情况下永远不会。