【发布时间】:2018-07-06 02:31:02
【问题描述】:
假设我有一个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);(在预先将向量保留/调整为 420000 个元素之后)超出的内存不会被释放。
我还注意到std::vector 的行为完全相同。
是否可以强制Qt 也释放内存?如果没有,是否有可能以某种方式手动释放它?
【问题讨论】:
-
为什么你希望
reserve(42)释放内存?它只需要确保有足够的空间,而不是没有足够的空间 -
你可以试试
std::vector::shrink_to_fit,但它没有约束力。 -
@tobi303 换句话说,我想保留足够的内存来对向量进行一些操作。在我进行操作后,我确定向量需要多少内存,所以我需要将进程保持在最低内存使用量......关于如何做到这一点的任何提示?
-
@FrançoisAndrieux 你说的
it's non-binding是什么意思? -
a
vector确实为您管理其内存(在很大程度上),如果您需要完全控制,我会求助于动态分配的 c 数组
标签: c++ qt memory-management stl qvector