Macros de gestion de memoire [c/c++]

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 110 fois - Téléchargée 32 fois

Contenu du snippet

quelques macros très très pratiques...

en C/C++,
Il faut faire de la Programmations haut niveau pour pouvoir développer de grds projets

et toutes les trois lignes on ne doit pas se soucier de la gestion mémoire....

cf le fichier...

Source / Exemple :


#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 */

A voir également

Ajouter un commentaire Commentaires
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
22 déc. 2003 à 17:56
salud,

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.
vObjects
Messages postés
17
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
29 décembre 2003

19 déc. 2003 à 00:38
de facon simple:

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 && @++;
cs_Thaeron
Messages postés
202
Date d'inscription
vendredi 6 juillet 2001
Statut
Membre
Dernière intervention
31 octobre 2007

19 déc. 2003 à 00:22
Salut, quand on ne comprend pas on ne note pas.
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
cs_Arnotic
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Membre
Dernière intervention
9 janvier 2012
1
18 déc. 2003 à 15:09
oki merci.
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
18 déc. 2003 à 15:06
Il s'agit juste de macros et pas d'un programme,
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.
Afficher les 6 commentaires

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.