2011-01-20 5 views
4

Visual C++ trouvé des fuites de mémoire dans mon code, donc j'amenuisé vers le bas comme cas de test le plus simple que je pouvais et a ceci:chaîne provoque une fuite de mémoire?

#define _CRTDBG_MAP_ALLOC // required 
#include <stdlib.h>   // to enable MSVC++ 
#include <crtdbg.h>   // memory leak detection 

#include <string> 

using namespace std; 

int main() { 

    string foo; 

    _CrtDumpMemoryLeaks(); 

    return 0; 
} 

Sortie:

Detected memory leaks! 
Dumping objects -> 
{130} normal block at 0x008748A8, 8 bytes long. 
Data: B4 F9 44 00 00 00 00 00 
Object dump complete.

Si je commente sur « string foo " ça ne détecte rien.

Dois-je désengager foo d'une façon ou d'une autre?

Répondre

10

Vous exécutez _CrtDumpMemoryLeaks() trop tôt et il signale le corps string comme une fuite. Ne l'exécutez qu'après que tous les objets locaux aient pu être détruits.

enveloppez tout le travail significatif dans une fonction distincte

void doStuff() 
{ 
    string variable; 
} 

ou ajouter la portée imbriquée:

int main() 
{ 
    { 
     string variable; 
    } 
    _CrtDumpMemoryLeaks(); 
    return 0; 
} 
+0

Ce qui est évidemment impossible si vous avez des objets basés sur une pile! '_CrtDumpMemoryLeaks()' provient de la bibliothèque d'exécution * C *; il ne prévoyait pas de destructeurs ... –

+2

@Oli: Impossible comment? sharptooth a démontré comment le faire. –

+0

Maintenant, je me sens bête de perdre autant de temps à essayer de comprendre ce que je faisais de mal et de demander ce qui s'est avéré être une question stupide. Merci pour l'explication. – zi3guw

2

Vous appelez _CrtDumpMemoryLeaks(); alors que la chaîne existe toujours - bien sûr, il détecte que la chaîne encore existe!

Essayez ceci:

#define _CRTDBG_MAP_ALLOC // required 
#include <stdlib.h>   // to enable MSVC++ 
#include <crtdbg.h>   // memory leak detection 

#include <string> 

using namespace std; 

int main() { 
    {  
     string foo; 
    } 

    _CrtDumpMemoryLeaks(); 

    return 0; 
} 
9

Vous devez appeler _CrtDumpMemoryLeaks après la fin du programme/bloc. La meilleure façon de le faire est d'avoir appel CRT qui se à la fin du programme, comme indiqué dans les _CrtDumpMemoryLeaks msdn article:

_CrtDumpMemoryLeaks est souvent appelé à la fin de l'exécution du programme pour vérifier que toute la mémoire allouée par l'application a été libéré. La fonction peut être appelée automatiquement à la fin du programme en activant le champ bit _CRTDBG_LEAK_CHECK_DF de le drapeau _crtDbgFlag en utilisant la fonction de _CrtSetDbgFlag.

En appelant la façon dont vous avez fait, il détecte la foo comme une fuite car il est destructor n'a pas encore été appelé depuis le bloc d'exécution n'a pas encore terminé.

+1

Juste pour clarifier la réponse @ Shinnok: n'appelez pas _CrtDumpMemoryLeaks() 'directement, mais appelez-le automatiquement en ajoutant cette ligne à votre programme: _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);' – GrahamS

+1

@GrahamS qui a résolu mon problème si aléatoire fuites: P merci. – Ricky

Questions connexes