динамическая память в QList
-
19-09-2019 - |
Вопрос
У меня нет большого опыта работы с 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
был динамическим и освобождал память при удалении элемента.Так что либо я что-то упускаю (весьма вероятно), либо это не динамическая структура.Есть ли у вас идеи, как заставить это работать?
С уважением
Решение
Из документы похоже, что это ожидаемое поведение:
Обратите внимание, что внутренний массив увеличивается только в течение срока существования списка.Он никогда не сжимается.Внутренний массив освобождается деструктором и оператором присваивания, когда один список присваивается другому.
Если вы хотите освободить память, у вас есть несколько вариантов.
- Убедитесь, что вызывается деструктор (используя delete {при условии, что вы сначала создали новый список} или позволяя объекту QList выйти за пределы области видимости)
- Назначьте пустой список своему большому списку (думаю, это сработает)
Другие советы
Помню, я читал об этом:
http://cplusplus-soup.com/2010/01/05/freedelete-not-returning-memory-to-os/
Кажется, это может быть связано с поведением выделения/удаления памяти, но я не уверен в этом на 100%.
QList находится на полпути между QVector (аналогично std::vector) и QLinkedList (аналогично std::list).QList содержит массив указателей на сами объекты.
Эта схема означает, что сортировка/переупорядочение списка происходит быстро, но хранилище указателей постоянно увеличивается по мере добавления элементов (аналогично вектору).Таким образом, удаление элементов из списка освобождает память, используемую элементами, но не указатель в массиве.
Чтобы освободить память, вам необходимо создать новый список.В QVector есть метод сжатия(), но в QList его нет.
QList рекомендуется для списков, содержащих < 1000 объектов.Если вам нужно обрабатывать очень большие списки и необходимо освобождать память при удалении объектов, вам следует рассмотреть возможность использования QLinkedList.
Попробуйте этот код, чтобы освободить память из QList
while( ! memList.isEmpty() )
delete memList.takeFirst();