Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme de redefinition de new/delete

18 réponses
Avatar
Dominique Vaufreydaz
Bonjour,

je veux faire un outil de suivi des allocation desallocation...
Je me suis dit, nickel, je redéfinis new, new[] et ses pendants
en delete. Pas de soucis. Sauf si la personne inclu un fichier
Windows en mode debug qui fait sa propre redéfinition
de new (pour pouvoir aussi faire sa propre gestion de fuite memoire).

Quelqu'un voit-il un moyen pour s'en sortir ? Je sais je peux
compiler en Release (donc sans utiliser les artefacts Winwin
pour ca et ca marche), mais l'idée générale c'est que c'est
pénible de ne pas avoir les 2 en meme temps...

Merci de vos lumieres. Doms.

10 réponses

1 2
Avatar
Dominique Vaufreydaz
Bonjour,

je veux faire un outil de suivi des allocation desallocation...
Je me suis dit, nickel, je redéfinis new, new[] et ses pendants
en delete. Pas de soucis. Sauf si la personne inclu un fichier
Windows en mode debug qui fait sa propre redéfinition
de new (pour pouvoir aussi faire sa propre gestion de fuite
memoire).
Quelqu'un voit-il un moyen pour s'en sortir ? Je sais je peux
compiler en Release (donc sans utiliser les artefacts Winwin
pour ca et ca marche), mais l'idée générale c'est que c'est
pénible de ne pas avoir les 2 en meme temps...


Precision, j'aimerais une solution multiplateforme.

Merci ! Doms.

Avatar
kanze
Dominique Vaufreydaz wrote:

je veux faire un outil de suivi des allocation
desallocation... Je me suis dit, nickel, je redéfinis
new, new[] et ses pendants en delete. Pas de soucis. Sauf
si la personne inclu un fichier Windows en mode debug qui
fait sa propre redéfinition de new (pour pouvoir aussi
faire sa propre gestion de fuite memoire).


Je ne vois pas où ça doit faire des problèmes. Le remplacement
s'effectue normalement au moment de l'édition des liens.
(J'utilise regulièrement mon propre operator new de déboggage
avec des programmes compilés avec VC++, sans problèmes. Des
programmes mode console, quand même, mais je ne crois pas que ça
change quelque chose à cet égard.)

Quelqu'un voit-il un moyen pour s'en sortir ? Je sais je peux
compiler en Release (donc sans utiliser les artefacts Winwin
pour ca et ca marche), mais l'idée générale c'est que c'est
pénible de ne pas avoir les 2 en meme temps...


Les deux en même temps, je ne crois pas que ce soit faisable. Ce
sont en fin de compte des fonctions, tous les deux avec le même
nom (après décoration).

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Arnaud Debaene
"Dominique Vaufreydaz" a écrit dans le message de news:

Bonjour,

je veux faire un outil de suivi des allocation desallocation...
Je me suis dit, nickel, je redéfinis new, new[] et ses pendants
en delete. Pas de soucis. Sauf si la personne inclu un fichier
Windows en mode debug qui fait sa propre redéfinition
de new (pour pouvoir aussi faire sa propre gestion de fuite memoire).



Si tu parles des MFC, malheureusement il n'y a pas grand chose à faire vu
que new et ses petits copains y sont redéfinis à grand coups de #define
(beurk!). Une raison de plus pour rester le plus éloigné possible des MFC...

Sinon, il n'y a pas à ma connaissance de redéfinition de new/delete dans
d'autres headers sous Windows (mais la CRT de Visual C++ en mode debug
inclus déjà tout un paquet de mécanismes pour tracer les fuites mémoire). Tu
peux préciser un peu plus ton problème?

Arnaud

Avatar
Dominique Vaufreydaz
Bonjour,

Si tu parles des MFC, malheureusement il n'y a pas grand chose à
faire vu que new et ses petits copains y sont redéfinis à grand coups
de #define (beurk!). Une raison de plus pour rester le plus éloigné
possible des MFC...


Non, pas de MFC dans mon prog...

Sinon, il n'y a pas à ma connaissance de redéfinition de new/delete
dans d'autres headers sous Windows (mais la CRT de Visual C++ en mode
debug inclus déjà tout un paquet de mécanismes pour tracer les fuites
mémoire). Tu peux préciser un peu plus ton problème?


En gros, je redefinis new en lui ajoutant des parametres (vaguement
la ligne et le nom du fichier de l'allocation, ca peut servir). Ca marche
tant que je n'inclus pas des trucs genre iostream.h ou string.h, ca pouf
la CRT me jete grave (parcequ'en fait je redeclare mon operateur new
avec un define aussi puisque j'ajoute des parametres non optionnel...

et donc forcement quand dans xdebug (appelé dans l'arbre d'include
de string.h) il redefinisse le new, pouf, ca pete...

Je pensais m'en sortir en utilisant un new défini dans mon namespace
et utilisé uniquement dans celui-ci, mais Visual ne veut pas (gcc ne rale
pas meme si lui rale sur d'autre probleme...).

Donc voila quoi, je voulais une instrumentation permettant a tous
les utilisateurs de ma lib d'instrumenter leur code histoire de voir
leur fuite memoire... Bon, reste que je dois pouvoir redéfinir
l'operateur new pour mes objets, mais la je perd le poil de trace
si je fais un new char[xx]...

Bref, une idée ?

Doms.

Avatar
Dominique Vaufreydaz
Bonjour,

Je ne vois pas où ça doit faire des problèmes. Le remplacement
s'effectue normalement au moment de l'édition des liens.
(J'utilise regulièrement mon propre operator new de déboggage
avec des programmes compilés avec VC++, sans problèmes. Des
programmes mode console, quand même, mais je ne crois pas que ça
change quelque chose à cet égard.)


Ben en mode debug, donc avec le symbole qui va bien qui est défini
si, y'a probleme. Probleme car je rajoute des parametres a new et donc
je suis oblige de faire un define pour les mettre en place...

Les deux en même temps, je ne crois pas que ce soit faisable. Ce
sont en fin de compte des fonctions, tous les deux avec le même
nom (après décoration).


Ben pas vraiment puisque moi j'ajoute mes propres parametres
(permettant entre autre de savoir sur quel ligne a ete fait le new
dans quel fichier) => probleme, je fais un define car j'ai pas le choix...

JE vais poster mon header, ca eclairera peut-etre...

Doms.

Avatar
Dominique Vaufreydaz
Bonjour,

voici le header en cause... :
// Only when asked
#ifdef TRACKING_MEMORY_LEAKS
#ifdef WIN32
#pragma warning(disable : 4291)
#endif

void * operator new( size_t size, int line, const char *file );
void * operator new[]( size_t size, int line, const char *file );
void operator delete( void *p );
void operator delete[]( void *p );

#ifdef OMISCID_NEW
#undef OMISCID_NEW
#endif

#define OMISCID_NEW new( __LINE__, __FILE__ )

#else // TRACKING_MEMORY_LEAKS is not defined

#define OMISCID_NEW new

#endif

#define new OMISCID_NEW

Donc forcement, ensuite si le new est redéfini dans un header...
Y'a toujours la solution d'appeler de force #include <string.h>
en premier dans mon header principal et donc ensuite, après redéfinition
de mon new, il ne sera plus appelé à nouveau, mais bon, la solution
ne me satisfait guere...

Merci de votre aide. Doms.
Avatar
Jean-Marc Bourguet
"Dominique Vaufreydaz" writes:

void * operator new( size_t size, int line, const char *file );
void * operator new[]( size_t size, int line, const char *file );
void operator delete( void *p );
void operator delete[]( void *p );


Je me demande si ton problème n'est pas que les deux opérateurs new
((size_t size, int line, const char *file) et (size_t size)) ne sont pas
utilisés et que delete ne fonctionne bien que pour le premier. Une
solution dans ce cas-là serait de remplacer l'operator new(size_t size) de
la bibliothèque par un qui fonctionne bien avec ton operator delete. (Et
de même pour les version []).

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Dominique Vaufreydaz
Bonjour,

Je me demande si ton problème n'est pas que les deux opérateurs new
((size_t size, int line, const char *file) et (size_t size)) ne sont
pas utilisés et que delete ne fonctionne bien que pour le premier.
Une solution dans ce cas-là serait de remplacer l'operator new(size_t
size) de la bibliothèque par un qui fonctionne bien avec ton operator
delete. (Et de même pour les version []).


Meme si mon probleme ne vient pas de la (coir ci dessou),
je veux bien quelques explications la dessus. Pourquoi mon
second delete ne fonctionne pas bien ?

Sinon, le probleme est simplement que je suis obligé de faire
un #define pour rajouter mes parametres et qu'ensuite, forcement
quand y'a une declaration de new, ca ne fonctionne pas a cause
de ce define... Je recherche donc une facon elegante de regler
le probleme.

Merci. Doms.

Avatar
Jean-Marc Bourguet
"Dominique Vaufreydaz" writes:

Bonjour,

Je me demande si ton problème n'est pas que les deux opérateurs new
((size_t size, int line, const char *file) et (size_t size)) ne sont
pas utilisés et que delete ne fonctionne bien que pour le premier.
Une solution dans ce cas-là serait de remplacer l'operator new(size_t
size) de la bibliothèque par un qui fonctionne bien avec ton operator
delete. (Et de même pour les version []).


Meme si mon probleme ne vient pas de la (coir ci dessou),
je veux bien quelques explications la dessus. Pourquoi mon
second delete ne fonctionne pas bien ?


Je n'en sais rien s'il fonctionne bien ou pas: j'ai pas vu le code. Sans
avoir le code complet, on ne peut que jouer à deviner.

Il n'y a qu'un operator delete, qui est appelé que la mémoire ait été
allouée avec operator new(size_t) ou operator new(size_t, je ne sais plus
quels autres paramètres). Si ton operator delete ne fonctionne pas bien
avec le résultat du premier, on a un problème. Enfin, ça c'est en
supposant que le problème a lieu a l'exécution et pas à la compilation, ce
dont on n'est pas sûr non plus.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Dominique Vaufreydaz
Bonjour,

Je n'en sais rien s'il fonctionne bien ou pas: j'ai pas vu le code.
Sans avoir le code complet, on ne peut que jouer à deviner.

Il n'y a qu'un operator delete, qui est appelé que la mémoire ait été
allouée avec operator new(size_t) ou operator new(size_t, je ne sais
plus quels autres paramètres). Si ton operator delete ne fonctionne
pas bien avec le résultat du premier, on a un problème. Enfin, ça
c'est en supposant que le problème a lieu a l'exécution et pas à la
compilation, ce dont on n'est pas sûr non plus.


Pb de compilation. Le de new/delete est assez simple (j'ajoute le bloc alloué
dans une liste, je l'enleve dans le delete, le probleme est uniquement
a la compilation).

Merci. Doms.

1 2