C'est normal.
Un vecteur ne désalloue jamais la mémoire allouée, c'est plus performant si tu fais plusieurs opérations dessus.
Si tu tiens réellement à ce que la mémoire allouée colle au nombre d'éléments, tu peux utiliser ce code :
PS : le erase ne sert à rien juste avant un clear (c'est exactement ce que ce dernier fait).
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::vector<TCompareResult>(tabResult).swap(tabResult);
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Il y a au moins quatre niveaux d'allocation a considerer dans le cas present.Envoyé par Pfeffer
Tout d'abord, il y a la memoire allouee par l'OS au processus. C'est celle que te permet de regarder le gestionnaire des taches.
Ensuite il y a la memoire que ton programme a alloue et pas liberee. Ce n'est pas necessairement la meme chose, car le runtime pour repondre a une allocation que tu vas va demander a l'OS de la memoire, mais il peut en demander plus pour ne pas avoir a demander perpetuellement a l'OS d'une part, parce que l'OS a une granularite differente (l'OS alloue par page -- souvent 4 K, parfois plus -- ou par groupe de pages) d'autre part, finalement parce que la memoire que tu a liberee peux ne pas pouvoir etre rendue a l'OS meme si elle est de taille convenable (par exemple parce qu'elle ne se trouve pas au bon endroit).
Les deux autres niveaux sont propres aux conteneurs de la bibliotheque standard.
Ces conteneurs utilisent des allocateurs, qui peuvent jouer le meme jeux que l'allocateur du runtime: allouer plus que necesasire immediatement et ne pas rendre directement a l'allocateur du runtime.
Quatriemement, les conteneurs eux-meme peuvent ne pas rendre la memoire directement a l'allocateur (difference entre capacity() et size()).
Dans le cas present, clear() ne change pas le resultat de capacity(), donc on reste au quatrieme niveau. Il y a des bonnes chances que tu ne voies pas non plus de difference meme avec la technique donnee par Laurent, a cause des 3 autres niveaux.
Merci pour tous ses éléments de réponses mais maitenant comment est ce que je peux faire pour réduire cette fuite mémoire!
En fait mon process maintenant, grâce au vector, ne prends pas beaucoup de mémoire (dans le gestionnaire des tâches). Entre 100 000 ko et 400 000 ko pendant l'opération. Et 100 000 ko à la fin de l'opération.
Ceci dit au niveau de la chagre dédiée, l'évolution reste consante. 900 Mo à la fin de la deuxième opération.
Je dois donc avoir quand même des fuites mémoires!
Partager