динамическая память в QList - PullRequest
3 голосов
/ 09 февраля 2010

У меня нет большого опыта работы с QT, и эта проблема появилась сегодня.

QList<int> memList;
const int large = 100000;

getchar();
for (int i=0; i<large; i++)
{
    memList.append(i);
}

cout << memList.size() << endl;
getchar();

for (int i=0; i<large; i++)
{
    memList.removeLast();
}

cout << memList.size() << endl;
getchar();

После первого цикла, когда я проверяю использование памяти, он увеличивается, поскольку новые элементы добавляются к memList, но после удаления их во втором цикле использование памяти остается на том же уровне. Я думал, что QList был динамическим и освободит память, когда элемент будет удален. Так что либо я что-то упускаю (очень вероятно), либо это не динамическая структура. У вас есть идеи, как заставить это работать?

Привет

Ответы [ 5 ]

4 голосов
/ 09 февраля 2010

Из документов видно, что это ожидаемое поведение:

Обратите внимание, что внутренний массив только увеличивается в течение срока действия списка. Это никогда не сжимается. Внутренний массив освобождается деструктором и оператором присваивания, когда один список назначается другому.

Если вы хотите освободить память, у вас есть несколько вариантов

  1. Убедитесь, что деструктор вызван (используя delete {при условии, что вы сначала создали список), или разрешив объекту QList выйти из области видимости)
  2. Назначьте пустой список вашему большому списку (думаю, что это сработает)
1 голос
/ 09 февраля 2010

Я вспоминаю, что читал об этом:

http://cplusplus -soup.com / 2010/01/05 / freedelete-не возвращающих-память-OS /

Возможно, это связано с поведением выделения / удаления памяти, но я не уверен на 100% в этом.

0 голосов
/ 15 сентября 2011

Попробуйте этот код, чтобы освободить память из QList

while( ! memList.isEmpty() )
    delete memList.takeFirst();
0 голосов
/ 02 июля 2010

QList рекомендуется для списков <1000 объектов. Если вам нужно обрабатывать очень большие списки и вам нужно восстановить память при удалении объектов, вам следует рассмотреть возможность использования QLinkedList. </p>

0 голосов
/ 09 февраля 2010

QList находится на полпути между QVector (аналогично std :: vector) и QLinkedList (аналогично std :: list). QList содержит массив указателей на сами объекты.

Эта схема означает, что сортировка / переупорядочение списка выполняется быстро, но хранилище указателей постоянно увеличивается по мере добавления элементов (аналогично вектору). Таким образом, удаление элементов из списка освобождает память, используемую элементами, но не указатель в массиве.

Чтобы восстановить память, вам нужно создать новый список. В QVector есть squeeze (), но в QList этого нет.

...