2009-01-08 4 views
3

J'essaie d'utiliser la détection de fuite de mémoire CRT, mais je reçois le message suivant dans Microsoft Visual Studio: "Fuites de mémoire détectées - ignorer le vidage d'objet". Je ne peux jamais obtenir le faire réellement et le dumping d'objet.Visual Studio _CrtDumpMemoryLeaks toujours ignorer le vidage d'objet

J'ai suivi les instructions dans l'article de Microsoft sur la détection de fuite de mémoire (http://msdn.microsoft.com/en-us/library/e5ewb1h3(VS.80).aspx) sans succès.

Dans mon stdafx.h je (reconstruit l'ensemble du projet):

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

Au point de ma demande, j'ai d'entrée:

_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 

Je suis aussi en espérant que cela afficher le nom du fichier et le numéro de ligne dans le format annoncé Microsoft:

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. 

Bien que je ne l'ai jamais été en mesure de même obtenez une décharge d'objet, mais je l'ai remarqué que d'autres disent qu'ils voient quelque chose le long de ces lignes (même avec _CRTDBG_MAP_ALLOC défini):

Detected memory leaks! 
Dumping objects -> 
{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. 

Je ne veux pas vraiment de passer du temps remplaçant les nouveaux opérateurs et supprimer, donc j'espérais que le débogage CRT m'aiderait. Si cela ne fonctionne pas, je pourrais finir par remplacer les nouveaux opérateurs et supprimer, mais je veux vraiment obtenir les informations d'allocation avec un nom de fichier et un numéro de ligne (croise les doigts).

Merci, Kiril

Répondre

1

Je ne l'ai pas ici sur ma machine, mais quand vous instal MSVC vous avez la possibilité d'installer (la plupart du) code source pour la bibliothèque d'exécution C (c.-à- pour MSVCRTxx.xxx). Si vous recherchez dans ce code source "ignorer le vidage d'objet", vous pourrez peut-être déterminer pourquoi le vidage d'objet est ignoré.

+0

OK, je vais essayer, merci pour l'info :). – Kiril

+3

Avez-vous eu la réponse Lirik. Pouvez-vous s'il vous plaît partager avec nous! – pankajt

1

Le nom du fichier de la raison et la ligne sont imprimés est parce que l'allocation a été effectuée à l'aide d'une macro new qui passe __FILE__ et __LINE__. Si vous ne voulez pas toucher new, vous ne passerez __FILE__ et __LINE__ au CRT et il ne sera pas capable d'imprimer ça. Il n'y a pas de grande magie en jeu ici, vraiment.

2

Je viens d'utiliser Visual Leak Detector après avoir reçu un gros vidage d'objets ayant fui sans noms de fichier/ligne en utilisant l'approche _CrtDumpMemoryLeaks. VLD a travaillé comme annoncé (c'est gratuit) et je suis plutôt content de ça.