5/5 (6 avis)
Snippet vu 5 413 fois - Téléchargée 32 fois
#ifndef MACROS_DE_GESTION_MEMOIRE_HPP #define MACROS_DE_GESTION_MEMOIRE_HPP //PB1(msg) affiche un msg d'err et sort ou lève une exception -1 //PB2(msg,nb) affiche un msg d'err et sort ou lève une exception nb //Considérez pour pour l'instant... (les DLL arrivent bientot...) #define PB1(txt) {exit(-1);} #define PB2(txt,numException) {puts(txt);exit(numException);} #ifdef MACROS_DE_GESTION_MEMOIRE #ifndef MACROS_DE_GESTION_MEMOIRE_HPP #define MACROS_DE_GESTION_MEMOIRE_HPP ///pour les allocations // allocation dynamiques - faire FREE apres utilisation // exemples :ALLOUE(t,TableEntiere_); - // ALLOUEn(text,char,25); // nota, vu que svt y a des erreurs, rajouter la taille d'un car de terminaison!!! #include <malloc.h> //pour enlever des bugs de Visual... #define FREE(ptr) do{if(ptr!=NULL)free(ptr);ptr=NULL;}while(0) #define BDELETE(ptr) do{if((ptr)!=NULL){delete(ptr);(ptr)=NULL;}}while(0) //#define MALLOC(type) ((type *)malloc((size_t)(sizeof(type)))) //#define MALLOCn(type,nb) ((type *)malloc((size_t)((nb)*sizeof(type)))) //TAILLE_B(void* ptr); /////inline TAILLE_B(void* ptr) {if (ptr != NULL) return _msize(ptr); else return 0;} // WARNING, EXCEPTION a recuperer #define ALLOUE(ptr,type) do{\ if ((ptr = ((type *)malloc((size_t)(sizeof(type)))) )== NULL) \ PB2("\n\nPAS ASSEZ DE MEMOIRE - Erreur allocation dynamique\n \t _ALLOUE(ptr,type)\n\n",-50);}while(0) #define ALLOUEn(ptr,type,nb) do{\ if ((ptr = ((type *)malloc((size_t)((nb)*sizeof(type)))) )== NULL) \ PB2("PAS ASSEZ DE MEMOIRE - Erreur allocation dynamique\n \t _ALLOUEn(ptr,type,nb)",-50);}while(0) //idem avec new #define ALLOUE2n(ptr,type,nb) do{\ if ((ptr = new type[nb])== NULL ) \ PB2("PAS ASSEZ DE MEMOIRE - Erreur allocation dynamique\n \t _ALLOUEn(ptr,type,nb)",-50);}while(0) //////RALLONGEx sont en Test #define RALLONGE(ptr,type) do{int taille; \ if (ptr != NULL) taille=_msize(ptr); else taille=0;\ if (( ptr = ( (type *)realloc(ptr,(size_t)(taille+ sizeof(type))) ) )== NULL) \ PB2("\n\nPAS ASSEZ DE MEMOIRE - Erreur de reallocation dynamique (_RALLONGE)\n\n",-50);}while(0) #define RALLONGEn(ptr,type,nb) do{int taille; \ if (ptr != NULL) taille=_msize(ptr); else taille=0;\ if (( ptr = ( (type *)realloc(ptr,(size_t)(taille+(nb)*sizeof(type))) ) )== NULL) \ PB2("\n\nPAS ASSEZ DE MEMOIRE - Erreur de reallocation dynamique (_RALLONGEn)\n\n",-50);}while(0) //ATTENTION, le type rallongé doit etre du mm type que rallonge // WARNING, EXCEPTION a recuperer #define AJUSTE(ptr,type,nb) do{if (( ptr = ( (type *)realloc(ptr,(size_t)((nb)*sizeof(type))) ) )== NULL)\ PB2("\n\nPAS ASSEZ DE MEMOIRE - Erreur de reallocation dynamique (reajuste)\n\n",-50);}while(0) #endif /* !MACROS_DE_GESTION_MEMOIRE_HPP */
22 déc. 2003 à 17:56
Merci pour vos com...
Les macros PB1 & PB2 permettent de sortir du prg ou d'envoyer des exception et donc on poura
les traiter plus loin...
Perso, J'utilise ce macros depuis 4 ans & G plus de pb de gestion mem depuis...
Voici un petit manuel:
en C on utilise
ALLOUE, ALLOUEn & FREE
voir RALLONGE, RALLONGEn & AJUSTE
en C++ on utilise
new & BDELETE
ALLOUE : alloue une case mémoire
ALLOUEn : alloue une table de n cases
FREE : libère la zone allouée
RALLONGE : rallonge une table de 1 case
RALLONGEn rallonge une table de n cases
AJUSTE : remet n cases pour ce qui a été précédement allouée (allocation ou destructions
implicites)
BDELETE : comme delete en évitant les erreurs données par certains compilateurs
Rq: lors de la création d'un pointeur, prenez l'habitude de lui affecter null, ou affectez
le directement, cela évite certains soucis
Voilà...
après les vac, je publierai des méthodes pour les exceptions ainsi qu'un logiciel complet:
MétaProgLight 2.0 (gestion de srces & doc auto)
sinon, je vous souhaite à tous un Joyeux et Saint Noël
@+ Nono.
19 déc. 2003 à 00:38
if ( (var (type)malloc(taille)) NULL ) {
cout << "Erreur ..." << endl;
// ou
// printf("Erreur ...
");
// peu importe ...
}
En C++ new/delete sont préférable à malloc()/free() (constructeur/destructeur)
Je n'est pas regardé le source mais, s'il y à une erreur quelconque, il faut quand même la gérer ... Même si ton code permet ou non d'éviter un 'plantage' du programme, il faut quand même savoir si l'allocation est ok ou non et savoir quoi faire selon le problème ...
Moi perso, je ne voit pas l'utiliter de ce source tout comme la première version que tu avais posté il y à quelques temps http://www.cppfrance.com/code.aspx?ID=10905
Sur ce, beubye && @++;
19 déc. 2003 à 00:22
J'ai pas tout compris a tes macros d'ailleurs (j'ai regardé vite fait aussi) mais ça m'a l'air pas mal pratique (j'ai la mauvaise habitude de ne jamais regardé si l'allocation avec malloc a été bien faite ni si la suppression d'un élément d'une liste chainé a été bien faite).
En tout cas continue =)
Bonne prog
18 déc. 2003 à 15:09
18 déc. 2003 à 15:06
je les utilise juste pour alléger l'écriture des codes et pour éviter de réécrire la protection a chaque fois....
En effet, sans ça, de nbreux codeur néglige de vérifier que leurs allocations ont étées bien effectuées et donc...
soit
- des calculs sont faux
- le prg plante pour des raisons qui n'ont rien à voir!!!
Je ne comprends pas du tt votre notation car C une astuce bien pratique.... Cependant, si vous attendez de véritable prg tt fait alors...
Amicalement,
Nono.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.