Скажем, у меня есть QVector
, и я вызываю QVector::reserve для 420000 элементов. Сразу после этого я снова вызываю 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();
}
Этот код дает сбой, вызывая исключение std::bad_aloc
(Unhandled exception at 0x7729C41F in QtConsoleApplication1.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0034F5E8.
) в 32-битной системе (поскольку система не поддерживает много оперативной памяти для одного процесса).
Однако, если я прокомментирую строки v->reserve(420000);
и v->resize(420000);
, все будет работать нормально. Вот как я заметил, что если я вызываю v->reserve(42);
и v->resize(42);
(после предварительного резервирования/изменения размера вектора до 420000 элементов), превышение памяти не освобождается.
Я также заметил, что std::vector
ведет себя точно так же.
Можно ли заставить Qt
также освобождать память? Если нет, то можно ли самому, вручную, как-то освободить?
reserve(42)
освободит память? Просто нужно убедиться, что места достаточно, а не то, что места не более чем достаточно. - person 463035818_is_not_a_number   schedule 26.01.2018std::vector::shrink_to_fit
, но это ни к чему не обязывает. - person François Andrieux   schedule 26.01.2018it's non-binding
? - person Jacob Krieg   schedule 26.01.2018vector
действительно управляет своей памятью для вас (в значительной степени), если вам нужен полный контроль, я бы прибегнул к динамически выделяемому c-массиву - person 463035818_is_not_a_number   schedule 26.01.2018shrink_to_fit
может изменитьcapacity
наsize
, может уменьшитьcapacity
, если оно большеsize
, или вообще не изменитьcapacity
. Дело за реализацией. - person François Andrieux   schedule 26.01.2018.reserve()
и.resize()
..reserve()
никогда ничего не сжимает, он просто гарантирует, что пространство предварительно выделено как минимум для такого количества элементов, сколько выreserve
. - person Jesper Juhl   schedule 26.01.2018If size is less than the current size, elements are removed from the end.
. Итак, если он удаляет с конца, почему память не освобождается? Если его элементы размещены в стеке, память должна освободиться, верно?... почему память не освобождается? - person Jacob Krieg   schedule 26.01.2018