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

new/delete soultion choisie et question

4 réponses
Avatar
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.

4 réponses

Avatar
Dominique Vaufreydaz
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 <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.


Avatar
Dominique Vaufreydaz
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 <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 ?

*Merci*. Doms.
Avatar
Jean-Marc Bourguet
"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

Avatar
Dominique Vaufreydaz
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.