_CRTDBG_MAP_ALLOC ne montrant pas de nom de fichier
Je suis en train d'essayer de détecter les fuites de mémoire, et je suis en utilisant faire _CRTDBG_MAP_ALLOC macro permettant de localiser les fuites de la zone. Donc, je suis à la définition de la MACRO comme suit:
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif
Dans mon code, j'ai:
UINT SomeFunThread( LPVOID pParam )
{
_CrtMemState crtMemStateStart;
_CrtMemState crtMemStateFinish;
_CrtMemCheckpoint(&crtMemStateStart);
//My suspisious code
_CrtMemCheckpoint(&crtMemStateFinish);
int nDifference(0);
_CrtMemState crtMemStateDifference;
nDifference = _CrtMemDifference(&crtMemStateDifference, &crtMemStateStart, &crtMemStateFinish);
if(nDifference > 0)
_CrtDumpMemoryLeaks();
return 0;
}
(Grâce à Tushar Jadhav: La consommation de mémoire augmente rapidement, puis diminue très lentement; fuite de mémoire?)
Mais le résultat montre quelque chose comme:
Detected memory leaks!
Dumping objects ->
{124058} normal block at 0x0000000031DED080, 24 bytes long.
Data: < 0 ` $ > C8 30 F7 EF FE 07 00 00 60 D2 24 1D 00 00 00 00
au lieu de quelque chose comme ceci:
Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}
normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
Alors, comment puis-je faire de ce spectacle un nom de fichier et l'emplacement de la fuite?
- Le code qui alloue juste n'a pas été compilé avec votre #définit en effet. Peuvent être situées dans une bibliothèque, pourrait être dans une DLL, comme les prêts à l'emploi C++ classe de modèle de spécialisations. Ou la DLL qui contient le code fut déchargé avant la fuite rapport a été généré.
- Alors, êtes-vous dire que ce n'était pas mon "suspect" du code lui-même, qui fuit; c'était un peu de code/bianraies/dll appelées dans "les codes suspects" ?
- Je dirais que c'est un code que vous n'avez pas trouvé, pourrait être n'importe où. L'habituel problème avec les fuites, n'est-ce pas? Si vous pouvez obtenir le nombre entre {accolades} répéter ensuite définir _crtBreakAlloc à ce nombre.
Vous devez vous connecter pour publier un commentaire.
Dans mon cas, j'ai fini par y compris les trucs de cette fil dans mon code. Il remplace le
new
opérateur et inclut le nom du fichier et le numéro de la ligne en elle pour imprimer plus tard. Vous ne savez pas si c'est applicable à Visual Studio uniquement.L'ensemble du test de code de référence source:
qui dans mon cas de test s'imprime:
Il semble que la ligne de la fuite ne s'est affiché si le CRT est allumé dans un fichier cpp.
// TODO: reference additional headers your program requires here
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>