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

surcharge operateurs new, new[], delete, delete[]

8 réponses
Avatar
Stephane Wirtel
Bonsoir à tous,

Pour un projet C++ que je dois développer, j'aimerais surcharger les
opérateurs new, new[], delete et delete[], afin de logger les
allocations mémoires que je fais durant l'exécution du logiciel. Ceci
afin de vérifier si je n'oublie rien, et limiter le risque de memory leak.

Je suis entrain de lire le livre de Bjarne Stroustrup, mais j'aimerais
savoir quelles seraient les manières que vous utiliseriez afin de faire
cela.

Je pense aussi créer une classe Exception, ou une héritage de
std::exception, afin de logguer les erreurs qui se produisent dans le
projet.

J'avais vu sur le site www.developpez.com qu'il était possible
de surcharger les opérateurs d'allocations mémoire de manière globale,
est-il possible de faire une surcharge mais uniquement pour certaines
classes ? Par exemple, pour les classes que j'ai créé. Voici le lien
dans lequel j'ai trouvé les informations.
http://loulou.developpez.com/tutoriels/moteur3d/partie1/#L2.2.1

Bien à vous,

Et bonne soirée.

Merci

Stéphane

8 réponses

Avatar
kanze
Stephane Wirtel wrote:

Pour un projet C++ que je dois développer, j'aimerais surcharger les
opérateurs new, new[], delete et delete[], afin de logger les
allocations mémoires que je fais durant l'exécution du logiciel.
Ceci

afin de vérifier si je n'oublie rien, et limiter le risque de memory
leak.


Surcharger, ou remplacer ?

Pour surcharger ces opérateurs, il suffit d'en définir des nouveaux,
avec d'autres paramètres, exactement comme on fait pour n'importe
quelle
autre fonction.

Pour les remplacer, il faut d'abord écrire une implémentation avec
exactement les même paramètres.

Je suis entrain de lire le livre de Bjarne Stroustrup, mais
j'aimerais

savoir quelles seraient les manières que vous utiliseriez afin de
faire cela.


Formellement, ça dépend de l'implémentation, mais dans la pratique,
dans
toutes les implémentations que je connais, il suffit que tu crées un
fichier objet avec tes implémentations, et que tu le donnes à
l'éditeur
de liens *avant* de donner les bibliothèques de base. (Je ne sais pas
comment ça se fait dans un IDE, mais sur la ligne de commande, c'est
en
général assez trivial, étant donné qu'en général, tu invoques
l'éditeur
de liens à travers un programme de pilotage, cl pour VC++, g++ pour
gcc,
etc., et que c'est ce programme de pilotage qui spécifie les
bibliothèques de base, systèmatiquement à la fin.)

Je pense aussi créer une classe Exception, ou une héritage de
std::exception, afin de logguer les erreurs qui se produisent dans le
projet.

J'avais vu sur le site www.developpez.com qu'il était possible de
surcharger les opérateurs d'allocations mémoire de manière
globale,

est-il possible de faire une surcharge mais uniquement pour certaines
classes ?


C'est possible d'ajouter des surcharges globaux, et c'est possible de
fournir un remplacement global.

C'est aussi possible de fournir des opérateurs new et delete propre à
une classe ou à une hièrarchie. Dans ce cas-ci, on déclare la
fonction
correspondante dans la class, par exemple :

class C
{
public:
void* operator new( size_t n ) ;
// ...
} ;

La recherche de l'opérateur et la résolution du surcharge suivent
exactement les même règles que n'importe quel opérateur surchargé.

C'est un peu particulier, parce que les fonctions operator new et
operator delete n'implémente qu'une partie de ce que fait les
opérateurs
new et delete. Donc, dans une expression new, le compilateur va
chercher
l'opérateur d'abord dans la classe, puis dans l'espace référentiel
global, à moins qu'on a précisé ::new, qui limite la récherche à
l'espace référentiel. Il va aussi chercher un constructeur, seulement
dans la classe, évidemment. Ensuite, il résoud les surcharges, et à
la
fin, il vérifie des droits d'accès. Si par exemple, il y a un
operator
new dans la classe, et qu'il est privé, une expression du genre :
new C
n'est permis que dans un membre de la classe ; en revanche :
::new C
marche toujours. Aussi, les opérateurs new de la classe cache les
opérateur new globaux. Si donc je défini un operator new( size_t, int
)
dans la classe, une expression du genre :
new C
n'est pas légal (mais ::new C si).

Je le signale, parce que j'ai déjà eu le problème, où j'ai défini
un
opérateur new propre à la classe, avec la signature classique. Et
qu'un
collègue a voulu créer un std::vector de la classe. Seulement,
l'implémentation de std::vector utilise (à travers les allocateurs)
un
new placement, et que le new placement était caché par l'opérateur
new
de la classe. On peut arguer que c'était une erreur dans
l'implémentation de std::allocator, et qu'il aurait dû utiliser un
::new
placement, mais c'est le genre de problème auquel il faut faire
attention.

--
James Kanze GABI Software http://www.gabi-soft.fr
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
Vincent
Je suis entrain de lire le livre de Bjarne Stroustrup, mais j'aimerais
savoir quelles seraient les manières que vous utiliseriez afin de faire
cela.


je l'ai vu en rayon, est-ce que c'est un bon livre sur le C++ ?

Vincent

Je pense aussi créer une classe Exception, ou une héritage de
std::exception, afin de logguer les erreurs qui se produisent dans le
projet.

J'avais vu sur le site www.developpez.com qu'il était possible
de surcharger les opérateurs d'allocations mémoire de manière globale,
est-il possible de faire une surcharge mais uniquement pour certaines
classes ? Par exemple, pour les classes que j'ai créé. Voici le lien
dans lequel j'ai trouvé les informations.
http://loulou.developpez.com/tutoriels/moteur3d/partie1/#L2.2.1

Bien à vous,

Et bonne soirée.

Merci

Stéphane


Avatar
Twxs
Vincent wrote:

Je suis entrain de lire le livre de Bjarne Stroustrup, >


je l'ai vu en rayon, est-ce que c'est un bon livre sur le C++ ?

Vincent


c'est un tres bon livre, mais pas forcement pour debuter

nicolas


Avatar
Stephane Wirtel
On va simplement dire que c'est le créateur du C++ qui crée un livre sur
le C++ :-) donc, ça doit certainement être très bien.

Stef
Avatar
Fabien LE LEZ
On Thu, 09 Dec 2004 08:40:22 +0100, Stephane Wirtel
:

On va simplement dire que c'est le créateur du C++ qui crée un livre sur
le C++ :-)

donc, ça doit certainement être très bien.


Pas forcément. C'est pas parce qu'on a inventé quelque chose qu'on est
forcé de savoir bien le décrire.

Pédagogiquement, le Stroustrup est très mauvais. Certains le
considèrent comme un bon livre de référence ; quoi qu'il en soit, si
tu n'as pas déjà un certain niveau en C++, il ne te servira pas à
grand-chose.


--
;-)

Avatar
Andre Heinen
On Wed, 8 Dec 2004 22:52:35 +0100, "Vincent"
wrote:

Je suis entrain de lire le livre de Bjarne Stroustrup,


je l'ai vu en rayon, est-ce que c'est un bon livre sur le C++ ?


Oui.

Chaque sujet est traité d'une façon très complète. Les quelque
mille pages contiennent vraiment beaucoup d'information,
présentée d'une manière très dense. Il n'est donc pas facile à
lire, et ne convient pas pour l'apprentissage du langage.

Mais il est indispensable pour tout qui veut se mettre
sérieusement au C++.

Personnellement, la première fois que je l'ai lu, j'ai appris
beaucoup... et lors de ma deuxième lecture, longtemps plus tard,
j'ai appris encore beaucoup de choses que je n'avais pas pu voir
la première fois parce que je ne connaissais pas encore assez
bien le langage. Cet ouvrage est vraiment précieux. De plus, je
l'utilise souvent comme référence.

Si tu es suffisamment à l'aise en anglais, il vaut mieux acheter
la version originale.

--
Andre Heinen
My address, rot13-encoded: n qbg urvara ng rhebcrnayvax qbg pbz


Avatar
Arnaud Meurgues
Fabien LE LEZ wrote:

Pédagogiquement, le Stroustrup est très mauvais. Certains le
considèrent comme un bon livre de référence ; quoi qu'il en soit, si
tu n'as pas déjà un certain niveau en C++, il ne te servira pas à
grand-chose.


Accessoirement, j'ai appris le C++ avec ça. Donc ça n'est pas
impossible, même si ce n'est pas le meilleur.

--
Arnaud
(Supprimez les geneurs pour me répondre)

Avatar
Fabien LE LEZ
On Thu, 09 Dec 2004 11:44:34 +0100, Arnaud Meurgues
:

Donc ça n'est pas
impossible


Il n'est pas non plus impossible de jouer du violon avec des gants de
boxe -- Coluche l'a prouvé ;-)


--
;-)