Вопрос

У меня нет большого опыта работы с 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 был динамическим и освобождал память при удалении элемента.Так что либо я что-то упускаю (весьма вероятно), либо это не динамическая структура.Есть ли у вас идеи, как заставить это работать?

С уважением

Это было полезно?

Решение

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

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

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

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

Другие советы

Помню, я читал об этом:

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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top