2010-02-09 6 views
3

Je n'ai pas beaucoup d'expérience avec QT et ce problème est sorti aujourd'hui.mémoire dynamique dans QList

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(); 

Après la première boucle lorsque je vérifie l'utilisation de la mémoire, il va comme de nouveaux éléments sont ajoutés à la memList, mais après les avoir retirés à l'intérieur de la deuxième boucle du reste utilisation de la mémoire au même niveau. Je pensais que QList était dynamique et il libérerait de la mémoire lorsque l'élément est supprimé. Donc soit il me manque quelque chose (très probable) ou ce n'est pas une structure dynamique. Avez-vous des idées pour le faire fonctionner?

Cordialement

Répondre

4

De l'docs il semble que ce soit le comportement attendu:

Notez que le tableau interne jamais grossit sur la durée de la liste. Ça ne rétrécit jamais. Le tableau interne est désalloué par le destructeur et par l'opérateur d'affectation, lorsqu'une liste est affectée à un autre.

Si vous voulez désallouer la mémoire que vous avez deux options

  1. Assurez-vous que le destructor est appelé (à l'aide de supprimer {en supposant que vous new'd la liste en premier lieu }, ou de permettre à l'objet QList de sortir du champ)
  2. Attribuer une liste vide à votre grande liste (pensez que cela fonctionne)
+0

Mais pour utiliser supprimer, ne je dois déclarer comme pointeur QList * memList ;? –

+0

@funny man, oui, vous devrez l'allouer en utilisant new – Glen

0

QList est entre QVector à mi-chemin (similaire à std :: vector) et QLinkedList (similaire à std :: list). QList contient un tableau de pointeurs sur les objets eux-mêmes.

Ce schéma signifie que le tri/réorganisation de la liste est rapide, mais le pointeur-store croît continuellement au fur et à mesure que des éléments sont ajoutés (similaire à un vecteur). Ainsi, supprimer des éléments de la liste libère la mémoire utilisée par les éléments, mais pas le pointeur dans le tableau.

Pour récupérer de la mémoire, vous devez construire une nouvelle liste. QVector a squeeze() mais cela ne semble pas présent dans QList.

-1

QListe recommandée pour les listes de < 1000 objets. Si vous devez gérer des listes très volumineuses et que vous avez besoin de la mémoire à récupérer lorsque les objets sont supprimés, vous devez envisager d'utiliser QLinkedList.

-2

Essayez ce code pour libérer la mémoire de QList

while(! memList.isEmpty()) 
    delete memList.takeFirst(); 
+0

Il n'y a pas de pointeur impliqué dans la question. Donc, vous ne pouvez rien supprimer. – alexisdm