begin process at 2012 05 30 04:13:48
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

Mémoire dynamique et gestion d'erreur


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Mémoire dynamique et gestion d'erreur

jeudi 31 août 2006 à 11:56:58 | Mémoire dynamique et gestion d'erreur

Polack77

Bonjours, ma question serais que se passe t'il si je fais un free sur un pointeur non défini (ou défini à 0).
    Je posse cette question (qui peut paraitre bizarre) car :

J'ai fais un programme pour une veille machine qui n'à que peut de mémoire donc j'ai fais le choix d'allouer dynamiquement ma mémoire uniquement quand j'en ai besoin et de la libérer dé que le besoin ne s'en fais plus sentir. Problème je gère des erreurs, en faite mon programme lit des fichiers qui ne sont pas forcement juste, et en cas d'erreur mon programme dois se terminer (apprêt avoir écris un log, mais ce n'est pas la question) je dois donc libérer toute la mémoire allouer avant de quitter (tout du moins d'apprêt ce que je me rappel de mes cours). J'aurais voulut faire une procédure globale en cas d'erreur et vue que je ne sais pas quand cette erreur vas ce produire je ne sais pas quel vont être mes variable où j'ai alloué de la mémoire ou non (à moins de crée un flag pour chaque'une mais si je peux l'éviter ca m'arrange). Donc j'ai en idée de faire un "truc" du genre :
#define MCR_TEST_ERREUR  if (ErreurCode != 0) {EcritLog(ErreurCode);free(Var1);free(Var2);free(Var3);...; return ErreurCode;}

Sachant que ma variable ou les erreurs sont stocker se nome toujours ErreurCode.

Admettons qu'à chaque fois que je fais un free je passe l'adrs contenu par mon pointeur à 0. Que se passe-t-il si je fais un free dessus? Je pense que "free(0);" cas ne fais rien mais en vrais je ne sais pas!

Pour le moment je considére que "free(0);" ne fais rien.

Sous UNIX (je précise mais je ne sais pas si cas change grand chose) que se passe t'il quand je quitte mon appli sans faire tout les "free"? La mémoire est rendue au system ou non? Et sous Windows?

Merci

Ce soir dans "triste monde tragique" :

Des vers qui mangent les programmeurs !
Des virus sorte des ordinateurs et attaque des gents !
jeudi 31 août 2006 à 12:45:04 | Re : Mémoire dynamique et gestion d'erreur

luhtor

Réponse acceptée !
Avec Xp, il rattrape les conneries et libèrent (en principe) toute la mémoire alloué dynamiquement. Je suppose que sous unix, ca doit etre pareil.

Mais pour etre sur que ton programme libère toute la mémoire. Tu peux par exemple crééer de nouvelles fonctions d'allocations:
my_malloc(...) et my_free(...) qui en plus de faire appel a malloc et free, stocke dans une liste l'ensemble des variables dynamiques. Comme ca a tout moment, tu sais ce qu'à alloué ton programme et s'il reste des variables non libérées. Et en cas d'erreur, suffit de détruire tous les pointeurs contenu dans la liste.


jeudi 31 août 2006 à 13:39:22 | Re : Mémoire dynamique et gestion d'erreur

Polack77

OUI!!! C'est une bonne idée!
Je vais peut être faire comme ca.

Si non j'y est repensé en mangeant et je me suis dit que je peut aussi faire comme ca :
#define MCR_TEST_ERREUR  if (ErreurCode != 0) {EcritLog(ErreurCode); if(Var1!=0){free(Var1);} if(Var2!=0){free(Var2);} if(Var3!=0){free(Var3);} ...; return ErreurCode;}
Mais je ne trouvais pas cas claire à la lecture. A moins de faire cas :
#define MCR_TEST_ERREUR \
    if (ErreurCode != 0)\
    {\
        EcritLog(ErreurCode);\
        if(Var1!=0)\
        {\
            free(Var1);\
        }\
        if(Var2!=0)\
        {\
            free(Var2);\
        }\
        if(Var3!=0)\
        {\
            free(Var3);\
        }\
        ...;\
        return ErreurCode;\
    }

Mais là je trouve cas lourd (oui je sais je suis chiant) donc je ne sais pas encor vraiment comment je vais faire cas!

La question : que fais "free(0);" reste ouverte, je trouve que si cas ne fais rien c'est le mieux (la définition n'est pas illisible ni lourde, tout du moins comme je le vois)



Ce soir dans "triste monde tragique" :

Des vers qui mangent les programmeurs !
Des virus sorte des ordinateurs et attaque des gents !
jeudi 31 août 2006 à 13:52:23 | Re : Mémoire dynamique et gestion d'erreur

BruNews

Administrateur CodeS-SourceS
Faut remettre à ZERO tes pointeurs si tu veux les tester:

void *pmem = 0;
....
....
pmem = malloc(...);
...
...
if(pmem) {free(pmem); pmem = 0;}

ciao...
BruNews, MVP VC++
jeudi 31 août 2006 à 13:59:49 | Re : Mémoire dynamique et gestion d'erreur

luhtor

Réponse acceptée !
Mais avec ma méthode, tu fais une fonction:
FreeAll();
qui libère tous les pointeurs de la liste. Car avec ta macro, a chaque fois que tu rajoutes une variable, faut aller modifier ta macro, alors que si tu utilises une liste. Ya plus de soucis.
jeudi 31 août 2006 à 14:05:31 | Re : Mémoire dynamique et gestion d'erreur

Polack77

Bà oui c'est noté dans le 1ér post. En faite pour le moment après chaque free je fais passée le pointeur à 0.
Pour le moment je considère que free(0) ne fais rien mais je veux savoir si ca ne fais vraiment rien pour éviter d'avoir à le tester car je ne trouve pas ca propre (voir mon 2ém post).
Merci quand même BruNews

Effectivement luhtor je commence à moi aussi pensé que ta solution est la mieux.

J'aimerais savoir quand même que fais free(0); je n'aime pas rester sur ma faim (et puis si free(0) ne fais rien tout est déjà fais alors...).


Ce soir dans "triste monde tragique" :

Des vers qui mangent les programmeu
jeudi 31 août 2006 à 14:26:42 | Re : Mémoire dynamique et gestion d'erreur

Polack77

Je viens de relire mon code et je vais choisir la solution de luhtor (merci) en fessant 3 fonction :
- MyMalloc : qui alloue de la mémoire en fonction du nombre d'octet demandé, retourne l'adrs de cette mémoire et la stocke dans un tableau global dynamique (vois pas comment faire autrement) l'ensemble des adrs allouer par lui.
- MyFree : qui libère la mémoire passée en argument et supprime la 'case' du tableau (elle retournera également un code d'erreur si la mémoire libérer n'appartiens pas au tableau, heeeeeeeee je réalise que ce point vas être chiant si ca arrive, cas ne dois pas arriver et pi c'est tout!!!)
- MyFreeAll : qui libère l'ensemble de la mémoire d'ont les adrs sont stocker dans mon tableau

Comme ca je peux ajouter/supprimer des variables sans me prendre la tête (comme le disais luhtor).

Merci à tous!


Ce soir dans "triste monde tragique" :

Des vers qui mangent les programmeurs !
Des virus sorte des ordinateurs et attaque des gents !
jeudi 31 août 2006 à 15:32:23 | Re : Mémoire dynamique et gestion d'erreur

luhtor

"un tableau global dynamique" => oue c'est pas terrible. En C++, on pourrait faire mieux, mais bon. D'autant plus qu'en C++, tu pourrais utiliser les conteneurs de la stl. Décidemment, je comprends pas pk on programme encore en C :)

jeudi 31 août 2006 à 15:37:37 | Re : Mémoire dynamique et gestion d'erreur

Polack77

Moi non plus (je ne comprends pas pourquoi on programme encore en C) mais c'est hélas pas moi qui choisi. Je mettrais (ici dans un post) mes fonctions dé que je les ais fini et tester.


Ce soir dans "triste monde tragique" :

Des vers qui mangent les programmeurs !
Des virus sorte des ordinateurs et attaque des gents !
jeudi 31 août 2006 à 16:48:29 | Re : Mémoire dynamique et gestion d'erreur

Polack77

Réponse acceptée !

Ca à été un peut long j'ai hu autre chose à faire entre temps, désolé si quelqu'un attendais apprêt ces fonction.
En final j'ai fais une liste chainer pour stocker les ards allouer (je trouvais ca plus pratique)
Désolé si il y à des faute d'orthographe je n'ai pas pris le temps de les corriger.

struct StrcutMemoireAllouer
{
    void * AdresseAlouer;
    struct StrcutMemoireAllouer * Suivant;
};

struct StrcutMemoireAllouer * MemoireAllouer = 0;

void * MyMalloc (size_t QuantiteMemoire)
{
void * Tempon;
struct StrcutMemoireAllouer * EnCours;
    Tempon = malloc(QuantiteMemoire);
    if (MemoireAllouer == 0) //Si 1ér allocation
    {
        MemoireAllouer = (struct StrcutMemoireAllouer*)malloc(sizeof(struct StrcutMemoireAllouer)); //crée le 1ér maillon
        (*MemoireAllouer).Suivant = 0; //initialise le pointeur vers suivant
        (*MemoireAllouer).AdresseAlouer = Tempon; //sauvgarde l'adrs retourner
    }
    else //si déja des alocation présante
    {
        EnCours = MemoireAllouer; //pointe le 1ér maillon de la chaine
        while ((*EnCours).Suivant != 0) //temps que l'on est pas à au dernier maillon
        {
            EnCours = (*EnCours).Suivant; //passe au maillon suivant
        }
        (*EnCours).Suivant = (struct StrcutMemoireAllouer*)malloc(sizeof(struct StrcutMemoireAllouer)); //aloue un nouveau maillon
        (*(*EnCours).Suivant).AdresseAlouer = Tempon; //Sauvgarde l'adrs allouer à la variable
        (*(*EnCours).Suivant).Suivant = 0; //marque le maillon comme étant le dernier
    }
    return Tempon; //renvoie l'adrs de la variable alouer
}

ErreurCode MyFree (void * AdresseALiberer)
{
struct StrcutMemoireAllouer * EnCours;
struct StrcutMemoireAllouer * Tempon;
    if (MemoireAllouer == 0) //Si la chaine n'existe pas
    {
        free(AdresseALiberer); //Libére le mémoire passée en paramétre
        return 999; //retourne un code d'erreur
    }
    Tempon = EnCours = MemoireAllouer; //Initialise les variable

    while (AdresseALiberer != (*EnCours).AdresseAlouer) //temps que l'ards n'est pas celle du maillon en cours
    {
        if ((*EnCours).Suivant == 0) //si on est dans le dernier maillon
        {
            free(AdresseALiberer); //Libére le mémoire passée en paramétre
            return 999; //retourne un code d'erreur
        }
        Tempon = EnCours; //on sauvgarde l'adresse de ce maillon
        EnCours = (*EnCours).Suivant; //on passe au suivant
    }

    if (EnCours == MemoireAllouer) //si 1ér maillon de la chaine
    {
        if ((*MemoireAllouer).Suivant == 0) //si pas d'autre maillon
        {
            free(MemoireAllouer); //libére la mémoire du 1ér maillon
            MemoireAllouer = 0; //marque le pointeur commme chaine inexistante
        }
        else //si dautre mallon
        {
            free(MemoireAllouer); //on libére le maillon en cours
            MemoireAllouer = (*EnCours).Suivant; //Le pointeur global pointe le suivant
        }
    }
    else //si au moin un autre maillon
    {
        (*Tempon).Suivant = (*EnCours).Suivant; //on ne pointe plus vers ce maillon et si le maillon en cours est le dernier alors la donnée Suivant = 0
        free(EnCours); //On libére le maillon en cours
    }
    free(AdresseALiberer); //Libére le mémoire passée en paramétre
    return 0;
}

void MyFeeeAll (void)
{
struct StrcutMemoireAllouer * EnCours;
struct StrcutMemoireAllouer * Tempon;
    if (MemoireAllouer != 0) //Si la chaine existe
    {
        Tempon = EnCours = MemoireAllouer; //Pointe le 1ér maillon
        do
        {
            free((*EnCours).AdresseAlouer); //Libére la mémoire alouer à une variable
            EnCours = (*EnCours).Suivant; //Passe au maillon suivant
            free (Tempon); //Libére le maillon présedant
            Tempon = EnCours; //Passe le tempon au maillon suiant
        }while ((*EnCours).Suivant != 0); //Temps que le dernier maillon n'a pas été libérer
    }
}

Ce soir dans "triste monde tragique" :

Des vers qui mangent les programmeurs !
Des virus sorte des ordinateurs et attaque des gents !

1 2

Cette discussion est classée dans : erreur, passe, mémoire, free, cas


Répondre à ce message

Sujets en rapport avec ce message

erreur "ne peut etre un read" [ par Sade ] Salut a tous le monde.Dans le programme que j'ai develoP, j'utilise le FileMapping pour pouvoir echange des données entre deux programme distinct fonc Probleme d'allocation de mémoire dynamique (malloc/free) [ par PhantomPowaa ] Bonjour,J'ai un petit probleme avec les fonctions malloc et free dans certains de mes programmes. Apparement le malloc s'effectue correctement, mais a Erreur de mémoire ? [ par larion ] Bonjour,Je viens de réaliser un projet (~2000 lignes) avec C++Builder permettant de gérer des bureaux virtuels.Ce programme utilise une Dll qui est a msg de compilation optionnel en cas d'erreur (VC) [ par magic_Nono ] Bonjour sous VC6, je vouidrai faire apparaitre optionnelement un msg dans la boite de débug de manière optionnelle. Avec le cas suivant : il faudrai Erreur sur delete[] et pb alocation mémoire [ par dan34 ] Salut,J'ai un soucis avec le bout de code suivant. En fait j'ai créé un objet qui contient un tableau de char dont j'alloue dynamiquement la taille en allocation dynamique de memoire avec structure imbriquer [ par Polack77 ] Bonjours, hé, mon premier message sur ce forum (je viens de finir mon projet en VBA, même si je ne pense pas que cela interesse plus de cas les gents, erreur mémoire [ par infodaoudi ] bonjour codeur;le code en vc++ m'affiche l'ereur suivante :Unhandled exception at 0x00416395 in rab1.exe: 0xC00000FD: Stack overflow., si j'ai bien co Problème avec la fonction free dans visual basic. [ par tobi222 ] J'ai créé une liste chainée toute simple avec où j'alloue de la mémoire dynamiquement et à la fin lorsque je détruis cette liste avec free visual m'en Free d'une matrice de structures [ par zizofredj ] Je suis entrain de travailler dans mon projet de thèse et j Erreur d'application c++ [ par kebab38 ] Bonjour, j'intervient sur une modification d'un programme assez long en C++, mais avant de commencer je doit resoudre une erreur d'application qui int


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,248 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales