Bonjour à tous, je voudrais surcharger les operateurs new, new[], delete
et delete[] afin de détecter les fuites de mémoire.
Idéalement, je
voudrais utiliser les macros __FILE_ et __LINE__ pour indiquer où les
fuites on été crées. Je voudrais également que l'utilisation des
nouveaux operateurs soient totalement transparante (pas d'operateur new
placé).
Comment s'effectue au niveau de la compilation le remplacement de ces
opérateurs?
Et y a t'il d'autres fonctions que l'on peut remplacer de
manière globale?
Bonjour à tous, je voudrais surcharger les operateurs new, new[], delete
et delete[] afin de détecter les fuites de mémoire.
Idéalement, je
voudrais utiliser les macros __FILE_ et __LINE__ pour indiquer où les
fuites on été crées. Je voudrais également que l'utilisation des
nouveaux operateurs soient totalement transparante (pas d'operateur new
placé).
Comment s'effectue au niveau de la compilation le remplacement de ces
opérateurs?
Et y a t'il d'autres fonctions que l'on peut remplacer de
manière globale?
Bonjour à tous, je voudrais surcharger les operateurs new, new[], delete
et delete[] afin de détecter les fuites de mémoire.
Idéalement, je
voudrais utiliser les macros __FILE_ et __LINE__ pour indiquer où les
fuites on été crées. Je voudrais également que l'utilisation des
nouveaux operateurs soient totalement transparante (pas d'operateur new
placé).
Comment s'effectue au niveau de la compilation le remplacement de ces
opérateurs?
Et y a t'il d'autres fonctions que l'on peut remplacer de
manière globale?
Bonjour à tous, je voudrais surcharger les operateurs new, new[], delete
et delete[] afin de détecter les fuites de mémoire. Idéalement, je
voudrais utiliser les macros __FILE_ et __LINE__ pour indiquer où les
fuites on été crées. Je voudrais également que l'utilisation des
nouveaux operateurs soient totalement transparante (pas d'operateur new
placé).
Comment s'effectue au niveau de la compilation le remplacement de ces
opérateurs? Et y a t'il d'autres fonctions que l'on peut remplacer de
manière globale?
Bonjour à tous, je voudrais surcharger les operateurs new, new[], delete
et delete[] afin de détecter les fuites de mémoire. Idéalement, je
voudrais utiliser les macros __FILE_ et __LINE__ pour indiquer où les
fuites on été crées. Je voudrais également que l'utilisation des
nouveaux operateurs soient totalement transparante (pas d'operateur new
placé).
Comment s'effectue au niveau de la compilation le remplacement de ces
opérateurs? Et y a t'il d'autres fonctions que l'on peut remplacer de
manière globale?
Bonjour à tous, je voudrais surcharger les operateurs new, new[], delete
et delete[] afin de détecter les fuites de mémoire. Idéalement, je
voudrais utiliser les macros __FILE_ et __LINE__ pour indiquer où les
fuites on été crées. Je voudrais également que l'utilisation des
nouveaux operateurs soient totalement transparante (pas d'operateur new
placé).
Comment s'effectue au niveau de la compilation le remplacement de ces
opérateurs? Et y a t'il d'autres fonctions que l'on peut remplacer de
manière globale?
Bonjour à tous, je voudrais surcharger les operateurs new, new[], de lete
et delete[] afin de détecter les fuites de mémoire. Idéalement, je
voudrais utiliser les macros __FILE_ et __LINE__ pour indiquer où les
fuites on été crées. Je voudrais également que l'utilisation d es
nouveaux operateurs soient totalement transparante (pas d'operateur new
placé).
Comment s'effectue au niveau de la compilation le remplacement de ces
opérateurs? Et y a t'il d'autres fonctions que l'on peut remplacer de
manière globale?
Methode simple qui marche avec VC++:
placer:
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
dans un fichier d'entete dont l'inclusion est rendue implicite dans tous
les fichiers de ton projet (options->C/C++->Avancé->Fichiers Include
forcés).
http://msdn2.microsoft.com/en-us/library/8c5ztk84.aspx
Puis dans le main.cpp, rajouter:
// Automatically dumps leaks on program exit
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag( tmpFlag );
pour qu'en fin d'execution la liste des fuites memoires soit affichée
dans la sortie de débogueur.
Tu peux avoir la liste des fuites sans faire de #define new, mais il
faut alors te contenter du numero d'allocation, au lieu de l'info
fichier + numéro de ligne.
Bonjour à tous, je voudrais surcharger les operateurs new, new[], de lete
et delete[] afin de détecter les fuites de mémoire. Idéalement, je
voudrais utiliser les macros __FILE_ et __LINE__ pour indiquer où les
fuites on été crées. Je voudrais également que l'utilisation d es
nouveaux operateurs soient totalement transparante (pas d'operateur new
placé).
Comment s'effectue au niveau de la compilation le remplacement de ces
opérateurs? Et y a t'il d'autres fonctions que l'on peut remplacer de
manière globale?
Methode simple qui marche avec VC++:
placer:
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
dans un fichier d'entete dont l'inclusion est rendue implicite dans tous
les fichiers de ton projet (options->C/C++->Avancé->Fichiers Include
forcés).
http://msdn2.microsoft.com/en-us/library/8c5ztk84.aspx
Puis dans le main.cpp, rajouter:
// Automatically dumps leaks on program exit
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag( tmpFlag );
pour qu'en fin d'execution la liste des fuites memoires soit affichée
dans la sortie de débogueur.
Tu peux avoir la liste des fuites sans faire de #define new, mais il
faut alors te contenter du numero d'allocation, au lieu de l'info
fichier + numéro de ligne.
Bonjour à tous, je voudrais surcharger les operateurs new, new[], de lete
et delete[] afin de détecter les fuites de mémoire. Idéalement, je
voudrais utiliser les macros __FILE_ et __LINE__ pour indiquer où les
fuites on été crées. Je voudrais également que l'utilisation d es
nouveaux operateurs soient totalement transparante (pas d'operateur new
placé).
Comment s'effectue au niveau de la compilation le remplacement de ces
opérateurs? Et y a t'il d'autres fonctions que l'on peut remplacer de
manière globale?
Methode simple qui marche avec VC++:
placer:
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
dans un fichier d'entete dont l'inclusion est rendue implicite dans tous
les fichiers de ton projet (options->C/C++->Avancé->Fichiers Include
forcés).
http://msdn2.microsoft.com/en-us/library/8c5ztk84.aspx
Puis dans le main.cpp, rajouter:
// Automatically dumps leaks on program exit
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag( tmpFlag );
pour qu'en fin d'execution la liste des fuites memoires soit affichée
dans la sortie de débogueur.
Tu peux avoir la liste des fuites sans faire de #define new, mais il
faut alors te contenter du numero d'allocation, au lieu de l'info
fichier + numéro de ligne.
Methode simple qui marche avec VC++:
placer:
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
dans un fichier d'entete dont l'inclusion est rendue implicite dans tous
les fichiers de ton projet (options->C/C++->Avancé->Fichiers Include
forcés).
Y compris dans ceux des bibliothèques dont tu n'as pas les
sources ?
http://msdn2.microsoft.com/en-us/library/8c5ztk84.aspx
Puis dans le main.cpp, rajouter:
// Automatically dumps leaks on program exit
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag( tmpFlag );
pour qu'en fin d'execution la liste des fuites memoires soit affichée
dans la sortie de débogueur.
Et que se passe-t-il en cas des choses comme :
#include <map>
? Au moins d'être sûr (mais comment) que tout fichier qui
utilise new (dans une fonction inline, ou dans un template) a
été inclu avant le #define, c'est garanti de ne pas marcher.
C'est aussi garanti de ne pas marcher dans les cas où une classe
utilisateur spécifie un new propre à la classe (chose quand même
assez fréquente).
En somme, c'est une technique à éviter.
Tu peux avoir la liste des fuites sans faire de #define new, mais il
faut alors te contenter du numero d'allocation, au lieu de l'info
fichier + numéro de ligne.
Je ne sais pas. Moi, j'arrive à avoir une trace de la pile, sans
le moindre macro.
Methode simple qui marche avec VC++:
placer:
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
dans un fichier d'entete dont l'inclusion est rendue implicite dans tous
les fichiers de ton projet (options->C/C++->Avancé->Fichiers Include
forcés).
Y compris dans ceux des bibliothèques dont tu n'as pas les
sources ?
http://msdn2.microsoft.com/en-us/library/8c5ztk84.aspx
Puis dans le main.cpp, rajouter:
// Automatically dumps leaks on program exit
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag( tmpFlag );
pour qu'en fin d'execution la liste des fuites memoires soit affichée
dans la sortie de débogueur.
Et que se passe-t-il en cas des choses comme :
#include <map>
? Au moins d'être sûr (mais comment) que tout fichier qui
utilise new (dans une fonction inline, ou dans un template) a
été inclu avant le #define, c'est garanti de ne pas marcher.
C'est aussi garanti de ne pas marcher dans les cas où une classe
utilisateur spécifie un new propre à la classe (chose quand même
assez fréquente).
En somme, c'est une technique à éviter.
Tu peux avoir la liste des fuites sans faire de #define new, mais il
faut alors te contenter du numero d'allocation, au lieu de l'info
fichier + numéro de ligne.
Je ne sais pas. Moi, j'arrive à avoir une trace de la pile, sans
le moindre macro.
Methode simple qui marche avec VC++:
placer:
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
dans un fichier d'entete dont l'inclusion est rendue implicite dans tous
les fichiers de ton projet (options->C/C++->Avancé->Fichiers Include
forcés).
Y compris dans ceux des bibliothèques dont tu n'as pas les
sources ?
http://msdn2.microsoft.com/en-us/library/8c5ztk84.aspx
Puis dans le main.cpp, rajouter:
// Automatically dumps leaks on program exit
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag( tmpFlag );
pour qu'en fin d'execution la liste des fuites memoires soit affichée
dans la sortie de débogueur.
Et que se passe-t-il en cas des choses comme :
#include <map>
? Au moins d'être sûr (mais comment) que tout fichier qui
utilise new (dans une fonction inline, ou dans un template) a
été inclu avant le #define, c'est garanti de ne pas marcher.
C'est aussi garanti de ne pas marcher dans les cas où une classe
utilisateur spécifie un new propre à la classe (chose quand même
assez fréquente).
En somme, c'est une technique à éviter.
Tu peux avoir la liste des fuites sans faire de #define new, mais il
faut alors te contenter du numero d'allocation, au lieu de l'info
fichier + numéro de ligne.
Je ne sais pas. Moi, j'arrive à avoir une trace de la pile, sans
le moindre macro.
Methode simple qui marche avec VC++:
placer:
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
dans un fichier d'entete dont l'inclusion est rendue implicite dans to us
les fichiers de ton projet (options->C/C++->Avancé->Fichiers Include
forcés).
Y compris dans ceux des bibliothèques dont tu n'as pas les
sources ?
Ben non, ca nessecite une recompilation du code, mais tu l'avais compris
je pense :-)
http://msdn2.microsoft.com/en-us/library/8c5ztk84.aspx
Puis dans le main.cpp, rajouter:
// Automatically dumps leaks on program exit
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag( tmpFlag );
pour qu'en fin d'execution la liste des fuites memoires soit affichée
dans la sortie de débogueur.
Et que se passe-t-il en cas des choses comme :
#include <map>Ca fonctionne. Je suppose que la STL de
VC++ prend en compte cet aspect.
D'ailleurs, le fichier source <map> n'est pas mentionné quand la fuite
provient d'une allocation effectuée dans la map, donc il y a bien une
astuce qui fait que le new utilisé n'est pas impacté par le #define. Et
ca ne semble pas etre un simple #undef. Je n'ai malheureusement pas le
temps de chercher...
? Au moins d'être sûr (mais comment) que tout fichier qui
utilise new (dans une fonction inline, ou dans un template) a
été inclu avant le #define, c'est garanti de ne pas marcher.
C'est aussi garanti de ne pas marcher dans les cas où une classe
utilisateur spécifie un new propre à la classe (chose quand même
assez fréquente).
Dans mon cas, ca a posé probleme avec free() et realloc() qui sont aussi
implicitement renomées par le #define _CRTDBG_MAP_ALLOC, et qui étaie nt
des noms de fonctions membres dans une des bibliotheques utilisées.En somme, c'est une technique à éviter.
Je l'ai juste mentionnée car elle est intégrée au compilo et tres f acile
a mettre en oeuvre. A ce sujet, si vous avez une bonne bibliotheque a me
conseiller (gratuite)...
Tu peux avoir la liste des fuites sans faire de #define new, mais il
faut alors te contenter du numero d'allocation, au lieu de l'info
fichier + numéro de ligne.
Je ne sais pas. Moi, j'arrive à avoir une trace de la pile, sans
le moindre macro.
Ce que propose VC++, c'est d'identifier le numéro de l'allocation
fautive, et deposer un break point dessus, a l'execution suivante. C'est
assez rustique, mais ca marche assez bien si tu peux facilement
effectuer 2 exécutions strictement identiques de ton programme. Si tu as
beaucoup de fuites dans ton programme, ce n'est clairement pas suffisant.
Methode simple qui marche avec VC++:
placer:
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
dans un fichier d'entete dont l'inclusion est rendue implicite dans to us
les fichiers de ton projet (options->C/C++->Avancé->Fichiers Include
forcés).
Y compris dans ceux des bibliothèques dont tu n'as pas les
sources ?
Ben non, ca nessecite une recompilation du code, mais tu l'avais compris
je pense :-)
http://msdn2.microsoft.com/en-us/library/8c5ztk84.aspx
Puis dans le main.cpp, rajouter:
// Automatically dumps leaks on program exit
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag( tmpFlag );
pour qu'en fin d'execution la liste des fuites memoires soit affichée
dans la sortie de débogueur.
Et que se passe-t-il en cas des choses comme :
#include <map>Ca fonctionne. Je suppose que la STL de
VC++ prend en compte cet aspect.
D'ailleurs, le fichier source <map> n'est pas mentionné quand la fuite
provient d'une allocation effectuée dans la map, donc il y a bien une
astuce qui fait que le new utilisé n'est pas impacté par le #define. Et
ca ne semble pas etre un simple #undef. Je n'ai malheureusement pas le
temps de chercher...
? Au moins d'être sûr (mais comment) que tout fichier qui
utilise new (dans une fonction inline, ou dans un template) a
été inclu avant le #define, c'est garanti de ne pas marcher.
C'est aussi garanti de ne pas marcher dans les cas où une classe
utilisateur spécifie un new propre à la classe (chose quand même
assez fréquente).
Dans mon cas, ca a posé probleme avec free() et realloc() qui sont aussi
implicitement renomées par le #define _CRTDBG_MAP_ALLOC, et qui étaie nt
des noms de fonctions membres dans une des bibliotheques utilisées.
En somme, c'est une technique à éviter.
Je l'ai juste mentionnée car elle est intégrée au compilo et tres f acile
a mettre en oeuvre. A ce sujet, si vous avez une bonne bibliotheque a me
conseiller (gratuite)...
Tu peux avoir la liste des fuites sans faire de #define new, mais il
faut alors te contenter du numero d'allocation, au lieu de l'info
fichier + numéro de ligne.
Je ne sais pas. Moi, j'arrive à avoir une trace de la pile, sans
le moindre macro.
Ce que propose VC++, c'est d'identifier le numéro de l'allocation
fautive, et deposer un break point dessus, a l'execution suivante. C'est
assez rustique, mais ca marche assez bien si tu peux facilement
effectuer 2 exécutions strictement identiques de ton programme. Si tu as
beaucoup de fuites dans ton programme, ce n'est clairement pas suffisant.
Methode simple qui marche avec VC++:
placer:
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
dans un fichier d'entete dont l'inclusion est rendue implicite dans to us
les fichiers de ton projet (options->C/C++->Avancé->Fichiers Include
forcés).
Y compris dans ceux des bibliothèques dont tu n'as pas les
sources ?
Ben non, ca nessecite une recompilation du code, mais tu l'avais compris
je pense :-)
http://msdn2.microsoft.com/en-us/library/8c5ztk84.aspx
Puis dans le main.cpp, rajouter:
// Automatically dumps leaks on program exit
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag( tmpFlag );
pour qu'en fin d'execution la liste des fuites memoires soit affichée
dans la sortie de débogueur.
Et que se passe-t-il en cas des choses comme :
#include <map>Ca fonctionne. Je suppose que la STL de
VC++ prend en compte cet aspect.
D'ailleurs, le fichier source <map> n'est pas mentionné quand la fuite
provient d'une allocation effectuée dans la map, donc il y a bien une
astuce qui fait que le new utilisé n'est pas impacté par le #define. Et
ca ne semble pas etre un simple #undef. Je n'ai malheureusement pas le
temps de chercher...
? Au moins d'être sûr (mais comment) que tout fichier qui
utilise new (dans une fonction inline, ou dans un template) a
été inclu avant le #define, c'est garanti de ne pas marcher.
C'est aussi garanti de ne pas marcher dans les cas où une classe
utilisateur spécifie un new propre à la classe (chose quand même
assez fréquente).
Dans mon cas, ca a posé probleme avec free() et realloc() qui sont aussi
implicitement renomées par le #define _CRTDBG_MAP_ALLOC, et qui étaie nt
des noms de fonctions membres dans une des bibliotheques utilisées.En somme, c'est une technique à éviter.
Je l'ai juste mentionnée car elle est intégrée au compilo et tres f acile
a mettre en oeuvre. A ce sujet, si vous avez une bonne bibliotheque a me
conseiller (gratuite)...
Tu peux avoir la liste des fuites sans faire de #define new, mais il
faut alors te contenter du numero d'allocation, au lieu de l'info
fichier + numéro de ligne.
Je ne sais pas. Moi, j'arrive à avoir une trace de la pile, sans
le moindre macro.
Ce que propose VC++, c'est d'identifier le numéro de l'allocation
fautive, et deposer un break point dessus, a l'execution suivante. C'est
assez rustique, mais ca marche assez bien si tu peux facilement
effectuer 2 exécutions strictement identiques de ton programme. Si tu as
beaucoup de fuites dans ton programme, ce n'est clairement pas suffisant.
Bonjour à tous, je voudrais surcharger les operateurs new, new[], delete
et delete[] afin de détecter les fuites de mémoire. Idéalement, je
voudrais utiliser les macros __FILE_ et __LINE__ pour indiquer où les
fuites on été crées. Je voudrais également que l'utilisation des
nouveaux operateurs soient totalement transparante (pas d'operateur new
placé).
Bonjour à tous, je voudrais surcharger les operateurs new, new[], delete
et delete[] afin de détecter les fuites de mémoire. Idéalement, je
voudrais utiliser les macros __FILE_ et __LINE__ pour indiquer où les
fuites on été crées. Je voudrais également que l'utilisation des
nouveaux operateurs soient totalement transparante (pas d'operateur new
placé).
Bonjour à tous, je voudrais surcharger les operateurs new, new[], delete
et delete[] afin de détecter les fuites de mémoire. Idéalement, je
voudrais utiliser les macros __FILE_ et __LINE__ pour indiquer où les
fuites on été crées. Je voudrais également que l'utilisation des
nouveaux operateurs soient totalement transparante (pas d'operateur new
placé).