Redéfinition des opérateurs new et delete

BunoCS Messages postés 15342 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 26 janvier 2023 - 3 févr. 2010 à 10:42
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 - 8 févr. 2010 à 17:34
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

cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
3 févr. 2010 à 12:21
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]
0
BunoCS Messages postés 15342 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 26 janvier 2023 103
3 févr. 2010 à 14:31
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...
0
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
3 févr. 2010 à 14:39
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]
0
BunoCS Messages postés 15342 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 26 janvier 2023 103
3 févr. 2010 à 17:40
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BunoCS Messages postés 15342 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 26 janvier 2023 103
8 févr. 2010 à 16:03
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...
0
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
8 févr. 2010 à 17:07
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]
0
BunoCS Messages postés 15342 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 26 janvier 2023 103
8 févr. 2010 à 17:32
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...
0
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
8 févr. 2010 à 17:34
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]
0
Rejoignez-nous