Redéfinition des opérateurs new et delete

Signaler
Messages postés
14952
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
25 janvier 2021
-
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
-
Chers amis bonjour!
J'ai un code assez conséquent qui contient potentiellement des fuites mémoire.
J'aimerais mettre en place un outil de suivi d'allocation de mémoires afin de tracer les éventuelles fuites.
Je pensais redéfinir les opérateurs new et delete afin de tracer les allocations (pointeur, taille, fichier, ligne).

Est-ce faisable rapidement? Avez-vous ce genre d'outil sous la main?

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...

8 réponses

Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Tu vas redéfinir les opérateurs new et delete de chaque classe ? Un peu lourd non ?

Sous Unix, il y a un outil super pour ça: valgrind. Il détecte les fuites mémoires (et d'autre chose comme les débordements de bornes, les doubles désallocations, etc...), et peut même parfois détecter la ligne exact dans le code.
Il existe sûrement un équivalent Windows, non ?

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Messages postés
14952
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
25 janvier 2021
93
L'idée est justement de modifier au minimum le code: c'est pour ça que je veux redéfinir les opérateurs.
Je ne connais pas valgrind mais des recherches m'ont montré que l'équivalent sous Windows était Purify. Or il est tellement gourmand en ressource que je peux pas le faire tourner correctement en même temps que mon appli...


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Est-ce que ton appli est multi-plateforme ? Si c'est le cas, je peux toujours te faire tourner un coup de valgrind :)

Peux-tu essayer sinon de redéfinir les appels system aux allocations mémoires ? Par exemple le projet Duma (ex Electric Fence), par un simple binding, permet de faire cela. Il check alors certains accès mémoires invalides. Tu peux peut être réutiliser leur technique pour détecter des fuites mémoires sans intrusion dans ton code. En revanche, ce n'est pas trivial.

N'y-t-il pas autre chose que Purify ? J'ai vu du "Insure++", et du PageHeap: http://support.microsoft.com/kb/286470, ou encore du http://www.softwareverify.com/cpp/memory/index.html.
Ou peut être Visual Leak Detector, qui doit faire partit de Visual Studio.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Messages postés
14952
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
25 janvier 2021
93
J'ai trouvé une source de Vecchio56 assez intéressante et rapide à mettre en oeuvre. Il faut que je vois si ça peut s'appliquer à mon application


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
14952
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
25 janvier 2021
93
Re,
J'ai réussi à redéfinir mes new et delete dans une dll. Il me suffit d'inclure ma dll dans mon projet et, en sortie, j'ai un log avec les fuites détectées (fichier, ligne, taille d'alloc).
ça marche bien sur de "petits" projets". Par contre, sur des plus gros incluant d'autres ressources tierces, il peut y avoir des soucis: par exemple, Xerces redéfinit lui aussi les opérateurs new et delete. Du coup, mon projet ne compile plus (syntax error dans XMemory.hpp).

Des idées pour faciliter la cohabitation?


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Essaie d'utiliser un vrai outil de vérification mémoire. La redéfinition des operateurs new et delete ne garantie pas que tu trouves toutes les fuites (ils n'agissent pas sur les malloc/free, et les new/delete custom).
De plus, il faut aussi redéfinir delete[].

En outils, il y a:
http://en.wikipedia.org/wiki/Memory_debugger
http://web.archive.org/web/20071212210815/http://www.cs.utexas.edu/users/jpmartin/memCheckers.html

Essaie vraiment d'en faire fonctionner un, sinon tu vas t'arracher les cheveux :)

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Messages postés
14952
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
25 janvier 2021
93
Ne t'inquiètes pas, j'ai pensé aux opérateur new[] et delete[] également.
Merci de tes liens, que je gardes sous le coude car très intéressant.

Après, si je "m'acharnes" à coder un truc pareil, c'est aussi pour pouvoir le ré-utiliser

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Ca n'a pas l'air simple du tout !
Un gars du MIT, a rédigé un article sur l'opérateur new. Il s'est bien cassé la tête apparemment:
http://www.scs.stanford.edu/~dm/home/papers/c++-new.html

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]