2009-05-22 8 views
5

J'ai un std::vector statique dans une classe. Lorsque j'utilise les outils de détection de fuites de mémoire de Microsoft:Fuite de mémoire (sorte de) avec un statique std :: vector

_CrtMemState state; 
_CrtMemCheckpoint(& state); 
_CrtMemDumpAllObjectsSince(& state); 

il signale une fuite après avoir inséré des trucs dans le vecteur. Cela a du sens pour moi parce que de nouveaux espaces sont alloués quand quelque chose est inséré dans le vecteur. Cet espace n'est libéré que lorsque le programme se termine (puisque le vecteur est statique). Est-ce correct?

Dans le destructeur de la classe qui contient le vecteur, je supprime l'objet que j'ai mis dans le vecteur. Cependant, la mémoire allouée lors de l'insertion est toujours présente. Est-il possible de supprimer cet espace?

+0

Pouvez-vous montrer le code qui insère des choses dans le vecteur et le code auquel vous faites référence qui supprime l'objet que vous mettez dans le vecteur? –

+0

Je peux si vous êtes intéressé, mais James et ilproxyil m'a aidé à résoudre le problème. Faites-moi savoir si vous êtes intéressé. – Joe

Répondre

16

Vous pouvez échanger le vecteur avec un vecteur vide - cela libèrera la mémoire.

Voir aussi Q: Shrinking a vector

+1

Génial! Ça a marché. Merci. J'aurais aimé poser cette question plus tôt, au lieu de me cogner la tête contre le mur pendant quelques jours. :-) – Joe

+0

Cette réponse est fausse: [le tour d'échange seulement _may_ libérer la mémoire] (http://stackoverflow.com/q/7829018/560648). –

8

Pour ajouter à ce que James a écrit. Il veut dire ceci:

std::vector<T>().swap(v); 

où 'v' est le vecteur dont vous voulez libérer la mémoire.

+0

Merci pour les détails. – Joe

0

C'est juste une anomalie de Visual Studio. Le destructeur de vecteurs libère la mémoire, mais le module de vérification de la mémoire ne le repère pas toujours, donc il se plaint. C'est un peu pénible, mais rien à craindre.

+1

Pas un caprice de VS. Son vecteur était statique. Il vérifiait les fuites avant que la statique ne soit libérée par le CRT. –

+1

C'est la bizarrerie. VS incorpore une version réduite de ce qui s'appelait auparavant Nu Mega Bounds Checker. Les anciennes versions de Bounds Checker fonctionnaient bien, mais la version incorporée avec VS7.x se trompe. Il signale régulièrement des fuites de mémoire inexistantes dans les objets statiques. –