new/delete soultion choisie et question

Le
Dominique Vaufreydaz
Bonjour,

Voila, j'ai donc choisie la simplicite difficile pour mon new delete. Voila les declarations
que je fais :
#ifdef WIN32
#pragma warning(disable : 4290) // warning about throw specification in new/delete declaration
#endif
void * operator new( size_t size ) throw (std::bad_alloc);
void * operator new[]( size_t size ) throw (std::bad_alloc);
void operator delete( void *p ) throw ();
void operator delete[]( void *p ) throw ();
void * operator new( size_t size, int Line, char * File ) throw (std::bad_alloc);
void * operator new[]( size_t size, int Line, char * File ) throw (std::bad_alloc);
void operator delete( void *p, int Line, char * File ) throw ();
void operator delete[]( void *p, int Line, char * File ) throw ();

#ifdef TRACKING_MEMORY_LEAKS
// include redefinition of new/delete operator
#include <System/TrackingMemoryLeaks.h>
#define OMISCID_TML (__LINE__,__FILE__)
#else
#define OMISCID_TML
#endif

Et dans le code quand je fais
char * toto = new char[512];

j'instrumente mais je poeux faire aussi
char * toto = new OMISCID_TML char[512];
et j'instrumente avec gestion des numeros de lignes.

Seul probleme : Visual studio m'oblige a avoir des delete avec Line et Char * qui
sont donc les mirroirs des news (gestion d'une exception dans le new a priori). Ca ne me dérange
pas et gcc non plus (-pedantic -Wall -Werror -std=c++98). Seul probleme
c'est que je ne peux pas instrumenter moi-meme le new, c'est-a-dire instrumenter delete comme news :
delete OMISCID_TML toto; Aucun des 2 compilos ne l'accepte

Une idée ?

Sinon, un commentaire général sur la méthode ?

Doms.
Vos réponses
Trier par : date / pertinence
Dominique Vaufreydaz
Le #297427
Dominique Vaufreydaz wrote:
Bonjour,

Voila, j'ai donc choisie la simplicite difficile pour mon new delete.
Voila les declarations que je fais :
#ifdef WIN32

#pragma warning(disable : 4290) // warning about throw specification
in new/delete declaration...
#endif
void * operator new( size_t size ) throw (std::bad_alloc);
void * operator new[]( size_t size ) throw (std::bad_alloc);

void operator delete( void *p ) throw ();
void operator delete[]( void *p ) throw ();
void * operator new( size_t size, int Line, char * File ) throw
(std::bad_alloc);
void * operator new[]( size_t size, int Line, char * File )
throw (std::bad_alloc);
void operator delete( void *p, int Line, char * File ) throw ();
void operator delete[]( void *p, int Line, char * File ) throw ();

#ifdef TRACKING_MEMORY_LEAKS
// include redefinition of new/delete operator
#include #define OMISCID_TML (__LINE__,__FILE__)
#else
#define OMISCID_TML
#endif

Et dans le code quand je fais
char * toto = new char[512];

j'instrumente mais je poeux faire aussi
char * toto = new OMISCID_TML char[512];
et j'instrumente avec gestion des numeros de lignes.

Seul probleme : Visual studio m'oblige a avoir des delete avec
Line et Char * qui sont donc les mirroirs des news (gestion d'une
exception dans le new a priori). Ca ne me dérange pas et gcc non
plus (-pedantic -Wall -Werror -std=c++98). Seul probleme c'est que
je ne peux pas instrumenter moi-meme le new, c'est-a-dire
instrumenter delete comme news : delete OMISCID_TML toto; Aucun des 2
compilos ne l'accepte...
Une idée ?

Sinon, un commentaire général sur la méthode ?

Doms.


Dominique Vaufreydaz
Le #297426
Bonjour,

Desolé, probleme de doigts.

Voila, j'ai donc choisie la simplicite difficile pour mon new delete.
Voila les declarations que je fais :
#ifdef WIN32
#pragma warning(disable : 4290) // warning about throw specification
// in new/delete declaration...
#endif
void * operator new( size_t size ) throw (std::bad_alloc);
void * operator new[]( size_t size ) throw (std::bad_alloc);
void operator delete( void *p ) throw ();
void operator delete[]( void *p ) throw ();
void * operator new( size_t size, int Line, char * File )
throw (std::bad_alloc);
void * operator new[]( size_t size, int Line, char * File )
throw (std::bad_alloc);
void operator delete( void *p, int Line, char * File ) throw ();
void operator delete[]( void *p, int Line, char * File ) throw ();

#ifdef TRACKING_MEMORY_LEAKS
// include redefinition of new/delete operator
#include #define OMISCID_TML (__LINE__,__FILE__)
#else
#define OMISCID_TML
#endif

Et dans le code quand je fais
char * toto = new char[512];

j'instrumente mais je poeux faire aussi
char * toto = new OMISCID_TML char[512];
et j'instrumente avec gestion des numeros de lignes.

Seul probleme : Visual studio m'oblige a avoir des delete avec
Line et Char * qui sont donc les mirroirs des news (gestion d'une
exception dans le new a priori). Ca ne me dérange pas et gcc non
plus (-pedantic -Wall -Werror -std=c++98). Seul probleme c'est que
je ne peux pas instrumenter moi-meme le new, c'est-a-dire
instrumenter delete comme news :
delete OMISCID_TML toto;

Aucun des 2 compilos ne l'accepte...

Une idée ?

Sinon, un commentaire général sur la méthode ?

*Merci*. Doms.
Jean-Marc Bourguet
Le #297389
"Dominique Vaufreydaz" writes:

Seul probleme : Visual studio m'oblige a avoir des delete avec
Line et Char * qui sont donc les mirroirs des news (gestion d'une
exception dans le new a priori). Ca ne me dérange pas et gcc non
plus (-pedantic -Wall -Werror -std=c++98). Seul probleme c'est que
je ne peux pas instrumenter moi-meme le new, c'est-a-dire
instrumenter delete comme news :


La forme avec placement des delete est rarement utilisee. De memoire,
uniquement quand un constructeur appele via une expression new jette
une exception.

Il faut que la forme normale de delete soit capable de gerer tout ce
qui est alloue, ce qui est souvent difficile et est un obstacle
pratique a la realisation de ses propres allocateurs.

delete OMISCID_TML toto;


Si tu sais quel delete il faut appeler,

toto->operator ~X();
operator ::delete(toto, __LINE__, __FILE__);

devrait fonctionner.

--
Jean-Marc

Dominique Vaufreydaz
Le #297388
Bonjour,

La forme avec placement des delete est rarement utilisee. De memoire,
uniquement quand un constructeur appele via une expression new jette
une exception.


Ce qui me fruste c'est que le compilo arrive a l'appeler, pourquoi je
ne pourrais pas ?

Il faut que la forme normale de delete soit capable de gerer tout ce
qui est alloue, ce qui est souvent difficile et est un obstacle
pratique a la realisation de ses propres allocateurs.


Pour ca il n'y a aucun probleme. Je changerais mon message d'erreur
en enlevant la ligne du delete (mais en indiquant bien la ligne du new
qui correspond).

Si tu sais quel delete il faut appeler,
toto->operator ~X();
operator ::delete(toto, __LINE__, __FILE__);
devrait fonctionner.


Mouai, l'idée était de garder un code lisible par tout le monde
en gardant la forme standard d'appel.

MErci. Doms.

Publicité
Poster une réponse
Anonyme