2014-07-06 2 views
0

J'ai ajouté ce qui suit à la fin de mon principal et je reçois le rapport de fuite de mémoire, mais il n'y a pas de point de rupture créé montrant où la fuite se produit dans mon code lorsque je l'exécute en mode débogage. J'utilise VS C++ 2010 express. Y at-il quelque chose que je fais mal ou quelque chose qui ne va pas avec le code que j'ai ajouté. Je peux poster plus de code s'il serait utile.Comment trouver où la fuite de mémoire est?

#ifdef _WIN32 
if (_CrtDumpMemoryLeaks()) { 
    cout << "Memory leaks!" << endl; 
} 
#endif 

#ifdef _DEBUG 
int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); 
flag |= _CRTDBG_LEAK_CHECK_DF; // Turn on leak-checking bit 
_CrtSetDbgFlag(flag); 
_CrtSetBreakAlloc(427); 
#endif 
+1

Si votre code est compilable sur Linux, essayez [valgrind] (http://valgrind.org/) sur Linux .... –

+0

Essayez VLD - https://vld.codeplex.com/ –

Répondre

1

http://msdn.microsoft.com/en-us/library/4wth1ha5.aspx

D'abord je soutiens que ces ensemble de code utilisées doit ici pour les premières lignes du corps principal de la fonction, mais je ne suis pas sûr. Pour autant que je sache, la fonction _CrtSetBreakAlloc laissera le débogueur se casser quand une application essaie d'allouer sur l'emplacement passé en tant qu'argument.

Avez-vous l'emplacement de la mémoire lorsque la mémoire de vidage du débogueur fuit dans la fenêtre de sortie? Vous devrez copier cet endroit et l'utiliser comme argument d'appel _CrtSetBreakAlloc sur la prochaine course (comme le numéro 276 dans la sortie ci-dessous par exemple)

Dumping objects -> 
{276} normal block at 0x007AC200, 4 bytes long. 
Data: < > CD CD CD CD 
Object dump complete. 

l'appel de la fonction serait _CrtSetBreakAlloc (276).

Personnellement, je vous recommande d'utiliser Visual Leak Detector, qui vous donnera plus d'idée sur l'endroit où la fuite s'est produite dans le message.

5
int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); 
flag |= _CRTDBG_LEAK_CHECK_DF; 
_CrtSetDbgFlag(flag); 

Cela suffit amplement pour permettre la détection des fuites de mémoire. N'appelez pas directement _CrtSetDbgFlag. Toutefois, afin d'obtenir la ligne de code source, où l'allocation de fuite a été appelée, vous devez faire un peu plus.

Ajouter ces lignes au début de chaque fichier .cpp, immédiatement après toutes les lignes #include:

#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 

Pour le projet MFC, cela suffit, les en-têtes MFC contiennent DEBUG_NEW. Pour les projets non-MFC, créer un fichier DebugNew.h:

#pragma once 

#include "crtdbg.h" 

#ifdef _DEBUG 
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) 
#else 
#define DEBUG_NEW 
#endif 

Inclure à chaque fichier .cpp. Des fuites de mémoire rapport devrait maintenant ressembler à ceci:

Detected memory leaks! 
Dumping objects -> 
c:\projects\test\main.cpp(20) : {181}  normal block at 0x005A80F8, 100 bytes long. 
Data: <    > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete. 
+0

Merci ... cela a bien fonctionné! – user3394850