2010-02-16 8 views
4

Я пытаюсь освободить память после использования QList, но она не работает должным образом. Вот мой код:Освобождение памяти QList

QList<double> * myList; 
myList = new QList<double>; 

double myNumber; 

cout << "CP1" << endl; 
getchar(); // checkpoint 1 

for (int i=0; i<1000000; i++) 
{ 
    myNumber = i; 
    myList->append(myNumber); 
    cout << myList->size() << endl; 
} 

cout << "CP2!" << endl; 
getchar(); // checkpoint 2 


for (int i=999999; i>0; i--) 
{ 
    myList->removeLast(); 
    cout << myList->size() << endl; 
} 

cout << "CP3!" << endl; 
getchar(); // checkpoint 3 

delete myList; 

cout << "CP4!" << endl; 
getchar(); // checkpoint 4 

Использование памяти:

  • CP1: 460k
  • CP2: 19996k
  • CP3: 19996k
  • CP4: 16088k

Так это выглядит, несмотря на удаление элементов и удаление myList используется еще большая часть памяти. Я считаю, что есть способ справиться с этим, но я не могу его найти.

Заранее благодарим за любую помощь.

Pawel

+0

Взгляните на http://stackoverflow.com/questions/2230618/dynamic-memory-in-qlist – Xorlev

+0

спасибо, но, похоже, я только что сделал то, что размещено в одном из комментариев (by @Glen) – Moomin

ответ

3

менеджер памяти не требуется, чтобы освободить память ваша программа выделила. В вашем освобождении нет проблем.

+0

Хм, но кажется, что в начале программа нуждалась только в 460 тыс., А после создания myList, добавления элементов, удаления элементов и удаления myList требуется 16088k. Так где же более 15000 тысяч? – Moomin

+3

Ваша программа выделяет дополнительную память при добавлении новых элементов, затем освобождает эту память при удалении всех элементов. Но диспетчер памяти держится за эту память и не возвращает ее ОС. –

+0

Приятно, и если какое-то другое приложение понадобится для этой части памяти, оно будет доступно для него, или диспетчер памяти сохранит его только для оригинального приложения? Есть ли способ заставить его вернуть ОС? – Moomin

0

QList - это массивный список. Массив автоматически расширяется, но автоматически не сжимается. Удаление элементов из списка не влияет на размер массива.

Чтобы обрезать массив до фактического размера, создайте новый QList и добавьте его в него. Затем удалите исходный список.

К сожалению, для этого нет способа удобства, например List.TrimExcess() в .NET.