Question

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

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 dans les deuxième boucle les séjours à l'utilisation de la mémoire au même niveau. Je pensais que QList était dynamique et libérerait la mémoire lorsque l'élément est supprimé. Donc, soit je manque quelque chose (très probable) ou si elle ne structure dynamique. Avez-vous des idées sur la façon de le faire fonctionner?

Cordialement

Était-ce utile?

La solution

De la docs il semble que ce soit le comportement attendu:

  

Notez que le tableau interne jamais grossit sur la durée de la liste. Il ne recule jamais. Le tableau interne est désallouée par le destructor et par l'opérateur d'affectation, lorsque l'on liste est attribué à 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 permettant de sortir du champ de l'objet QList)
  2. Attribuer une liste vide à votre grande liste (pensez que cela fonctionne)

Autres conseils

Je me rappelle avoir lu à ce sujet:

http: // cplusplus- soup.com/2010/01/05/freedelete-not-returning-memory-to-os/

Il semble qu'il peut être à voir avec le comportement allocation mémoire / suppression, mais je ne suis pas 100% sûr.

QList est à mi-chemin entre QVector (similaire à std :: vecteur) et < a href = "http://qt.nokia.com/doc/4.6/qlinkedlist.html" rel = "nofollow noreferrer"> QLinkedList (similaire à std :: liste). QList est titulaire d'un tableau de pointeurs vers les objets eux-mêmes.

Ce schéma signifie que le tri / réorganisant la liste est rapide, mais le pointeur magasin se développe en permanence que des éléments sont ajoutés (similaire à un vecteur). Ainsi, la suppression d'é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 la mémoire, vous devez construire une nouvelle liste. QVector a compression () mais cela ne semble pas présent dans QList.

QList est recommandé pour les listes de <1000 objets. Si vous avez besoin de gérer des listes très grandes et ont besoin de la mémoire à récupérer sous forme d'objets sont supprimés, vous devriez envisager d'utiliser QLinkedList.

Essayez ce code à la mémoire libre de QList

while( ! memList.isEmpty() )
    delete memList.takeFirst();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top