Comment puis-je forcer mon std::map pour désallouer la mémoire utilisée?
J'utilise un std::map, et je ne peux pas me libérer de la mémoire, de retour à l'OS. Il ressemble,
int main(){
aMap m;
while(keepGoing){
while(fillUpMap){
//populate m
}
doWhatIwantWithMap(m);
m.clear();//doesnt free memory back to OS
//flush some buffered values into map for next iteration
flushIntoMap(m);
}
}
Chaque (fillUpmap) alloue autour de 1gig, donc je suis très intéressé par l'obtention de ce retour à mon système avant qu'il mange à tous ma mémoire.
Ive a connu la même chose avec std::vector, mais là, j'ai pu le forcer à libérer en faisant un swap avec un vide std::vector. Cela ne fonctionne pas avec la carte.
Lorsque je utiliser valgrind il est dit que toute la mémoire est libérée, donc ce n'est pas un problème de fuite, puisque tout est effacé en place bien après une course.
edit:
De la chasse d'eau qui doit apparaître après l'claire.
Notez que votre OS probablement alloue de l'espace d'adresse lorsque vous essayez d'allouer de la mémoire, mais seulement alloue réel, RAM physique lorsque vous appuyez sur la mémoire. Et si vous ne l'utilisez plus que la RAM, mais d'autres programmes en ont besoin, son contenu sera transférée sur le disque. Suite à la libération de la mémoire réellement libère de la RAM.
OriginalL'auteur monkeyking | 2010-04-13
Vous devez vous connecter pour publier un commentaire.
m.clear()
libère de la mémoire retour à la tas, mais il est fréquent de voir des tas implémentations de ne pas divulguer que le retour à l'OS (même lorsqu'ils le peuvent, des questions telles que la fragmentation de le rendre dur).C'est ainsi que le défaut de l'allocateur de travaux, si vous avez indiqué votre propre allocateur de la carte, il pourrait avoir son propre cache. Cependant, même dans ce cas, il devrait être mis en cache afin d'être réutilisés immédiatement de toute façon.
Cartes n'ont pas un concept de capacité de vs la taille de la voie vecteurs.
OriginalL'auteur
Que le comportement est normal, la bibliothèque d'exécution de garde que la mémoire allouée par la classe map disponible le processus, de sorte que la prochaine fois qu'il a besoin d'allouer de la mémoire, il n'a pas à passer au système d'exploitation. C'est un moment de l'exécution de la bibliothèque d'optimisation.
OriginalL'auteur martsbradley
Si vous créez la carte sur le tas (par le biais des nouvelles), la suppression il permettra de libérer toute la mémoire qu'il a utilisés.
OriginalL'auteur Ferruccio
J'ai fait un test simple, quand j'ai mis quelques données dans un std::map et ensuite appeler std::map::clear().
c'est le résultat de printf inséré dans mon test:
Je pense que vous devriez également vérifier votre allocateur de comportement, mais je pense que votre défaut std::allocator en fait désalloue la mémoire comme vous vous attendez, mais que la mémoire n'est pas retourné à l'OS. Par la façon dont le système d'exploitation utilisez-vous?
La question ici est de savoir comment vous mesurez
can't seem to free the memory back to the OS.
et comment pouvez-vous être sûr queI could force it to free by doing a swap with an empty std::vector.
Êtes-vous vraiment sûr que la mémoire allouée, en fait, remonte à l'OS?OriginalL'auteur Sergei Kurenkov
Vous pourriez peut-être créer un allocateur personnalisé, ou tout simplement utiliser Du coup de pouce piscine de la bibliothèque.
OriginalL'auteur JRL
Swap Trick? Je sais que c'est la façon dont vous le faites avec des vecteurs et des autres, mais je v enot fait avec les cartes avant de.
OriginalL'auteur Michael Dorgan