2010-04-19 14 views
1

Je travaille sur un projet utilisant de nombreuses bibliothèques externes sous Windows. J'ai eu un problème avec la fuite de mémoire: j'ai détecté beaucoup de fuites de mémoire en remplaçant l'opérateur new/new [] et delete/delete []. Le problème est que je sais combien de blocs de mémoire fuient, mais je ne sais pas où les trouver, dans des fonctions surchargées, je pourrais enregistrer la taille et la position du bloc mem affecté, sans trace de pile.Méthode de détection de fuites de mémoire C++

Donc, pour faire face à cela, je suppose que j'ai besoin de noter la trace de la pile aussi (mais comment?), Ou est-il possible de trouver quel code a causé la fuite de la mémoire?

Merci beaucoup pour votre aide.

+0

Voir http://stackoverflow.com/questions/105659/how-can-one-grab-a-stack-trace-in-c –

Répondre

3

J'utilise l'approche suivante pour fournir new avec des informations sur quel fichier et ligne qui alloue chaque bloc de mémoire:

void operator delete(void *p, const char* filename, int line); 
void operator delete(void *p, const char* filename, int line, const std::nothrow_t&); 
void operator delete[](void *p, const char* filename, int line); 
void operator delete[](void *p, const char* filename, int line, const std::nothrow_t&); 

void *operator new(std::size_t n, const char* filename, int line); 
void *operator new(std::size_t n, const std::nothrow_t&, const char* filename, int line); 
void *operator new[](std::size_t n, const char* filename, int line); 
void *operator new[](std::size_t n, const std::nothrow_t&, const char* filename, int line); 

#define new foo_new 
#define foo_new new(__FILE__, __LINE__) 
+0

Cela ne fait cependant rien pour les bibliothèques tierces. – Hasturkun

0

Il y a aussi des COTS qui peuvent montrer des fuites de mémoire pour vous, tels que Rational Purify (http://www-01.ibm.com/software/awdtools/purify/win/) . Je mentionne cela comme nous l'avons utilisé dans ma dernière position. Je suppose qu'il y en a aussi des gratuits. S'il vous plaît mentionner s'il y a lieu.