2010-02-16 6 views
4

J'essaie de libérer de la mémoire après avoir utilisé QList, mais cela ne semble pas fonctionner correctement. Voici mon code:Qlist memory deallocation

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 

Utilisation de la mémoire:

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

Il ressemble à malgré la suppression des éléments et la suppression myList encore une grande partie de la mémoire est utilisée. Je crois qu'il y a un moyen de le gérer mais je ne le trouve pas.

Merci d'avance pour toute aide.

Pawel

+0

Jetez un oeil à http://stackoverflow.com/questions/2230618/dynamic-memory-in-qlist – Xorlev

+0

merci, mais je dirais que je viens de faire ce qui est posté dans un des commentaires (par @Glen) – Moomin

Répondre

3

gestionnaire de mémoire est nécessaire pour ne pas libérer la mémoire de votre programme a alloué. Il n'y a pas de problèmes dans votre désallocation.

+0

Hmm, mais il semble qu'au début, le programme n'a besoin que de 460k et après la création de myList, l'ajout d'éléments, la suppression d'éléments et la suppression de myList, il faut 16088k. Alors, où est plus de 15000k? – Moomin

+3

Votre programme alloue de la mémoire supplémentaire lorsque vous ajoutez de nouveaux éléments, il libère ensuite cette mémoire lorsque vous supprimez tous les éléments. Mais le gestionnaire de mémoire conserve cette mémoire et ne la restitue pas à l'OS. –

+0

Nice, et si une autre application aurait besoin de cette partie de la mémoire serait-elle disponible pour elle ou le gestionnaire de la mémoire ne le garde que pour l'application originale? Y a-t-il un moyen de forcer le retour à l'OS? – Moomin

0

QList est une liste basée sur un tableau. Le tableau se développe automatiquement, mais ne rétrécit pas automatiquement. Supprimer des éléments de la liste n'affecte pas la taille du tableau.

Pour réduire le tableau à la taille réelle, créez un nouveau QList et ajoutez-y le contenu. Puis supprimez la liste d'origine. Malheureusement, il semble qu'il n'existe aucune méthode pratique pour ce faire, comme le List.TrimExcess() dans .NET.