Bonjour,
J'ai besoin d'un peu d'aide sur une question de redéfinition des opérateurs d'allocation de mémoire. J'ai lu la partie traitant de ce point dans le tutorial de Loulou sur la réalisation d'un moteur 3D, mais certains points restent flous.
Tout d'abord le contexte : le but est d'arriver à logger un message automatiquement dés qu'une allocation ne peut se faire correctement. Autrement dit on veut que le new se comporte exactement comme d'habitude, mis à part qu'avant de lancer une exception bad_alloc, il logge un message (dans un gestionnaire de log quelconque). L'application se débrouille ensuite avec cette exception.
Comme je veux avoir un comportement le plus proche possible de celui par défaut, la question que je me pose est : comment l'opérateur new est-il implémenté en standard (j'utilise aCC sous HP-UX) ? Est-ce qu'il passe par malloc pour allouer les zones mémoire ? Autrement dit, si je surcharge new comme ceci :
... est-ce que, en interne, le fonctionnement est réellement identique à ce qu'aurait fait le new standard, hormis le fait qu'on logge un message ? Ou est-ce que je m'en éloigne vraiment (fonctionnellement ou techniquement) ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #define new new(__FILE__, __LINE__) void* operator new (size_t size, const char* file, unsigned line) { void* result = malloc(size); if (!result) { // (ici on logge un message d'erreur par un quelconque gestionnaire de logs...) throw bad_alloc(); } return result; }
Je demande ça car les problèmes techniques, aussi bien stabilité que perfs, sont extrêmement importants dans nos applications, et je ne veux pas que ces aspects techniques puisse être remis en cause d'une quelconque façon par cette surcharge.
Ma deuxième question concerne les autres types d'erreurs lors de la construction. Là on a vu le problème de l'allocation en elle-même. Y aurait-il un moyen (sans toucher au code déjà fait) d'arriver à logger un message d'erreur dés qu'un constructeur (quelle que soit la classe) lance une exception ? A la suite de quoi elle serait relancée (throwafin de laisser l'application la traiter de façon plus appropriée. Je ne vois pas comment faire ça mais peut-être aurez vous une idée...
Merci d'avance
Partager