Redéfinition de new

Résolu
tcok Messages postés 61 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 3 août 2005 - 3 août 2005 à 11:40
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011 - 3 août 2005 à 14:30
Bonjour



Je voudrais savoir comment faire pour redefinir l'operateur new
(delete, new[] et deleete[] aussi) en c++. J'ai trouvé ceci dans la
librairie standard mais lorsque j'essaye de l'utiliser -> erreur de
compilation (fonction new existe deja) :



inline void *__cdecl operator new(size_t, void *_Where) _THROW0()


{ // construct array with placement at _Where


return (_Where);


}




Je n'arrive pas à m'en sortir, c'est pour faire une dll de deboggage qui detecterais les fuites de mémoires.

Merci



tcok

10 réponses

xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
3 août 2005 à 11:56
Il faut que tu regardes du coté de set_new_handler.

Je t'invite à regarder ceci entre autres :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcstdlib/html/vclrf_new_setnewhandler.asp

Cordialement,
X.
3
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
3 août 2005 à 12:34
Tu veux redéfinir les opérateurs new et delete pour une classe ou globalement ?

Un exemple de new/delete globalement redéfinis :

#include <new>
#include
#include<exception>
using namespace std;

void * operator new( size_t sz ) throw(bad_alloc)
{
cout << "allocation de " << sz << " octets." << endl;
void * ptr = malloc(sz);
if ( ptr == 0 )
{
cout << "erreur allocaltion!!!";
throw bad_alloc();
}
return ptr;
}

void * operator new[]( size_t sz ) throw(bad_alloc)
{
cout << "allocation de " << sz << " octets." << endl;
void * ptr = malloc(sz);
if ( ptr == 0 )
{
cout << "erreur allocaltion!!!";
throw bad_alloc();
}
return ptr;
}

void operator delete( void * ptr ) throw()
{
free(ptr);
}

void operator delete[]( void * ptr ) throw()
{
free(ptr);
}

int main()
{
int * i = new int; // 4 octets
delete i;
short * s = new short; // 2 octets
delete s;
char * c = new char; // 1 octet
delete c;
int * ti = new int[12]; // 48 octets
delete[] ti;
}
3
BunoCS Messages postés 15480 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 12 juin 2024 103
3 août 2005 à 11:46
Est-ce que ça ne marcherait pas ça:
#define new TaFonction

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
tcok Messages postés 61 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 3 août 2005
3 août 2005 à 11:51
C'est ce que j'ai essye de faire avant mais ca ne fonctionne pas bien
avec les macros. je n'ai aucun moyen de recuperer le nombre d'octets
qui seront alloués ni à quel emplacement en mémiore. En ce moment
j'utilise cette méthode :



#define new (before(true,__FUNCTION__,__LINE__,__FILE__),false) ? NULL : new


#define delete (before(false,FUNCTION,__LINE__,__FILE__),false) ? NULL : delete

void before(bool alloc, const char* function, const unsigned int line, const char* file)


{


}




Cela me permet de compter le nombre d'objet qui seront crée/détruit
mais je ne fais aucun controle sur le nombre d'octets, je vérifie
seuleument si nombre d'objet crée = nombre d'objet détruit a la fin.
0

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

Posez votre question
BunoCS Messages postés 15480 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 12 juin 2024 103
3 août 2005 à 11:57
Regarde

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
tcok Messages postés 61 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 3 août 2005
3 août 2005 à 11:58
Merci beaucoup je vais regarder ca.

tcok
0
tcok Messages postés 61 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 3 août 2005
3 août 2005 à 12:40
Je veux redefinir globalement new et delete.

La doc de msdn m'a permit d'ajouter un handler dans le cas ou on a une
erreur d'allocation mais ne permet pas effectivement de recuperer le nb
de bytes et le pointeur.




Merci xterminhate, je vais essayer ta source voir ce que je peux faire

je vous tient au courant



tcok

[auteurdetail.aspx?ID=213313 ]
0
tcok Messages postés 61 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 3 août 2005
3 août 2005 à 12:53
Ok j'ai du faire quelque modifs mais ca marche impecablement.



merci
0
NoRabbit Messages postés 224 Date d'inscription samedi 26 juillet 2003 Statut Membre Dernière intervention 30 mars 2009
3 août 2005 à 13:19
sinon, un très bon lien :
http://loulou.developpez.com/tutoriels/moteur3d/partie1/#L2

ça concerne un moteur 3D mais les outils (debug, log,...) sont très bien fait.
Y a justement une classe qui redéfinit les fonctions new et delete afin de détecter les fuites mémoire.

.:. NoRabbit .:.
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
3 août 2005 à 14:30
ui, par rapport à la soluce de base de Bruno,

qui est moins que propre (la soluce bien sur)



en faisant précéder le define d'un

#ifdef new

#undef new

#enduf

#define new monNew



tant qu'il a le mm proto, ça marchera et sera de porté globale



mais bon C pas propre du tt



mieux vaut une fonction ou une macro de surcharge (cf une de mes premieres sources)

et n'utiliser que celle ci

___________________________________________________________
Magicalement
Nono
0
Rejoignez-nous