IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Libérer mémoire si erreur allocation


Sujet :

C

  1. #21
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    il faut tester et libérer chaque allocation.
    tester pour éviter les "segmentation faults", libérer pour éviter les fuites mémoires.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  2. #22
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par leternel Voir le message
    il faut tester et libérer chaque allocation.
    tester pour éviter les "segmentation faults", libérer pour éviter les fuites mémoires.
    Et de ce fait, le code précédent est-il correcte à vos yeux ?
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  3. #23
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    L'alternative, c'est de faire moins d'allocations, ce qui a l'avantage de garder ton tableau sous forme d'un bloc continu (enfin, deux blocs, si on compte celui des pointeurs).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #24
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Citation Envoyé par darkwall_37 Voir le message
    Et de ce fait, le code précédent est-il correcte à vos yeux ?
    non, parce que si une erreur d'allocation survient, tout ce qui a été alloué est désalloué (par un free() direct, et non un appel à un desallocation_1D()…) mais la boucle continue!
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #25
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par darkwall_37 Voir le message
    Et de ce fait, le code précédent est-il correcte à vos yeux ?
    Correcte probablement, mais tres complexe pour pas grand chose.
    En essayant de simplifier (attention, code non teste)
    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
     
    unsigned long long int *allocate_1D_ullong( unsigned long long int n )
    {
        unsigned long long *p;
     
        errno = 0;
        p = calloc(n*sizeof(unsigned long long int), 1); 
     
        if (p == NULL)
        {
          fprintf(logger, "allocate.h::allocate_1D_ullong -> %s\n", strerror(errno));
        }
     
        return p;
    }


    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    int **allocate_2D_int( unsigned long long int x, unsigned long long int y )
    {
        int **t;
        if ( (t = malloc( x*sizeof(int*))) )
        {
            int *test_malloc;
            unsigned long long int i;
     
            for ( i=0 ; i<x ; i++ )
            {
                if ( (t[i] != allocate_1D_int(y)) )
                {                
                    unsigned long long int j ;
                    for (j=i ; j>0 ; i--)
                    {
                        free(t[j]) , t[j] = NULL;
                    }
                    free (t), t = NULL;
                }
            }
        }
        return t;
    }
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #26
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned long long int i;
    Le type size_t devrait être utilisé pour parcourir des tableaux.
    Voir http://www.viva64.com/en/t/0044/

  7. #27
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    @gangsoleil
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    int **allocate_2D_int( unsigned long long int x, unsigned long long int y )
    {
        int **t;
        if ( (t = malloc( x*sizeof(int*))) )
        {
            int *test_malloc; // On peut le virer ?
            unsigned long long int i;
     
            for ( i=0 ; i<x ; i++ )
            {
                t[i]=? avant de le tester
                if ( (t[i] != allocate_1D_int(y)) )
                {                
                    unsigned long long int j ;
                    for (j=i ; j>0 ; i--)
                    {
                        free(t[j]) , t[j] = NULL;
                    }
                    free (t), t = NULL;
                }
            }
        }
        return t;
    }
    Cordialement
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  8. #28
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je crois que tu voulais dire if ( !(t[i] = allocate_1D_int(y)) )
    Ou en plus clair: if ( (t[i] = allocate_1D_int(y)) == NULL )
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #29
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je crois que tu voulais dire if ( !(t[i] = allocate_1D_int(y)) )
    Ou en plus clair: if ( (t[i] = allocate_1D_int(y)) == NULL )
    Oui, bien sur.

    J'ai tellement l'habitude d'ecrire tout sur plusieurs lignes que j'ai "corrige" t[i] = alloc() en t[i] != alloc()
    Je reprends donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            for ( i=0 ; i<x ; i++ )
            {
                t[i] = allocate_1D_int(y);
                if ( t[i] == NULL )
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  10. #30
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    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
    16
    17
    18
    19
    20
    21
    22
    int **allocate_2D_i( unsigned long long int x, unsigned long long int y )
    {
        int **t = NULL;
        if ( (t = malloc( x*sizeof(int*))) )
        {
            unsigned long long int i;
            for ( i=0 ; i<x ; i++ )
            {
                if ( !( t[i] = allocate_1D_i(y) ) )
                {
                    unsigned long long int j;
                    for (j=i-1 ; 0<=j ; j--) // j= i-1 car l'allocation à j=i à echouée donc pas besoin de desallouer et il faut aller jusqu'à 0 non ?
                        free(t[j]), t[j]=NULL;
     
                    free(t), t=NULL;
                    i=x;
                }
            }
        }
        else fprintf(logger,"allocate.h::allocate_2D_i -> %s\n", strerror(errno));
        return t;
    }
    Pour la boucle en effet, j'avais oublier "i=x" pour sortir de la boucle en cas d'erreur.

    @gangsoleil, je vois que vous mettez errno à 0 chaque fois qu'errno est susceptible de changer de valeur suite à une erreur. Il faut donc que j'initialise mon errno à 0 à chaque début de fonction où une erreur est susceptible de se produire ?
    @Medinoc, ce que vous faites c'est comme un tableau 1D que vous transformez en 2D ? J'ai pas tout compris =)
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  11. #31
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    • Ton alloue X tableaux de Y entiers (représentant chacun une colonne), et tableau de X pointeurs pointant sur chaque tableau.
    • Mon code fait un tableau de X*Y entiers, et un tableau de X pointeurs pointant sur chaque "colonne" du tableau.

    Dans les deux cas, à la fin on a l'équivalent d'un tableau 2D de X*Y entiers, et on s'en sert de la même façon: tab[x][y] à travers deux niveaux de pointeurs.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #32
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    • Ton alloue X tableaux de Y entiers (représentant chacun une colonne), et tableau de X pointeurs pointant sur chaque tableau.
    • Mon code fait un tableau de X*Y entiers, et un tableau de X pointeurs pointant sur chaque "colonne" du tableau.

    Dans les deux cas, à la fin on a l'équivalent d'un tableau 2D de X*Y entiers, et on s'en sert de la même façon: tab[x][y] à travers deux niveaux de pointeurs.
    Ah okay, intéressant en effet. Il faut que je regarde ça de plus près.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  13. #33
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par darkwall_37 Voir le message
    Okay alors adieu le cast sur malloc
    Pas forcement. Si tu as des raisons personnelles que tu juges bonnes, si tu n'as pas de warning lors de tes malloc sans cast alors tu pourras recommencer le cast mais cette fois pour de bonnes raisons (les tiennes) et non pour eviter les warning. Un warning n'est d'ailleurs jamais une tres bonne chose. Il signifie "je (le compilo) ne suis pas certain d'avoir bien compris ce que vous voulez faire". Dans ces conditions il vaut mieux le resoudre que le masquer car cela elimine alors 50% des bugs potentiels

    Citation Envoyé par darkwall_37 Voir le message
    @gangsoleil, je vois que vous mettez errno à 0 chaque fois qu'errno est susceptible de changer de valeur suite à une erreur. Il faut donc que j'initialise mon errno à 0 à chaque début de fonction où une erreur est susceptible de se produire ?
    Bonjour
    Dans l'absolu ce n'est pas utile. Si on regarde errno apres que l'erreur se soit produite, qu'il ait ete a zero ou pas avant l'erreur importe peu.
    Cela ne se justifiera que si tu fais un traitement pointu sur plusieurs etapes et que tu veux verifier que errno ne bouge pas durant toutes les etapes...

    Citation Envoyé par darkwall_37 Voir le message
    @Medinoc, ce que vous faites c'est comme un tableau 1D que vous transformez en 2D ? J'ai pas tout compris =)
    Regarde un echiquier. Chaque case est identifie par une position en [lig][col] mais si tu le decoupes et le mets bout a bout, alors chaque meme case pourra etre identifiee par un unique index [i]
    D'une facon generale, une case [x][y] d'un tableau 2D peut aussi etre identifiee par l'index [x * nb_cols + y]. D'ailleurs la memoire d'un ordi n'est qu'en une seule dimension...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #34
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Oui je vois, je suis familiarisé avec les échecs, j'en ai fait 15 ans en clubs =).
    Pour les tableaux 2D->1D, je connais bien. En VBA notamment, je les utilise parce qu'il n'est pas possible de redimensionner la taille des colonnes.
    D'ailleurs, est-ce plus performant d'utiliser un tableau 1D comme tableau 2D bien qu'il y ait la fonction de transformation d'indice 2D -> 1D ?
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  15. #35
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par darkwall_37 Voir le message
    @gangsoleil, je vois que vous mettez errno à 0 chaque fois qu'errno est susceptible de changer de valeur suite à une erreur. Il faut donc que j'initialise mon errno à 0 à chaque début de fonction où une erreur est susceptible de se produire ?


    Citation Envoyé par Sve@r Voir le message
    Dans l'absolu ce n'est pas utile. Si on regarde errno apres que l'erreur se soit produite, qu'il ait ete a zero ou pas avant l'erreur importe peu.
    Cela ne se justifiera que si tu fais un traitement pointu sur plusieurs etapes et que tu veux verifier que errno ne bouge pas durant toutes les etapes...
    En fait, la norme precise que les fonctions peuvent mettre errno a une valeur, pas qu'elles doivent le faire.
    Et l'experience m'a montre que dans je-ne-sais-plus-quel-cas, c'est effectivement le cas, ce qui fait qu'on peut se retrouver avec une ancienne valeur d'errno.

    Exemple avec le code suivant, en supposant que les deux fonctions appelees sont en erreur (c'est a dire qu'elles retournent -1), que la premiere met errno a quelque chose, et que la seconde ne fait pas son boulot sur errno :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ret_code = appel_fontion (param, param2);
    if (ret_code == -1)
    {
      /* traitement d'erreur, mais qui ne quitte pas */
    }
     
    ret_code = appel_fonction_qui_n_affecte_pas_errno (param3); 
    if (ret_code == -1)
    {
       printf ("erreur : %d, %s\n", errno, strerror(errno));
    }
     
    /* suite du code */

    J'ai passe des heures a comprendre pourquoi "appel_fonction_qui_n_affecte_pas_errno" plantait comme elle le disait, mais elle plantait pour une autre raison en fait, et ne mettait pas errno.

    Depuis, je mets errno a 0 avant tout appel a une fonction.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  16. #36
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    J'ai déjà eu le même genre de problème avec GetLastError(). C'est de telles fonctions que proviennent les erreurs "L'opération s'est terminée avec succès."
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #37
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    [HS, mais presque dans le sujet, mais pas vraiment non plus]

    Citation Envoyé par Médinoc Voir le message
    C'est de telles fonctions que proviennent les erreurs "L'opération s'est terminée avec succès."
    Attention, certaines API ont des codes de retour "ERROR_SUCCESS"

    [fin du HS]
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  18. #38
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Merci pour votre aide et vos réponses aussi claires que précise. Sujet clos. Pour le moment
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  19. #39
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ensuite, je pense que ton nettoyage est un peu redondant. Personnellement, j'aurais plutôt fait ceci (c'est toujours du code boomerang, mais calqué sur le même type de code boomerang utilisé quand on ne retourne pas les données allouées)
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    t_file *file_create(char *s, const char *r )
    {
    	int keep_allocs = 0;
    	t_file *f = NULL;
    	if ( (f = malloc(sizeof *f)) != NULL )
    	{
    		const t_file fInit = {0};
    		*f = fInit;
     
    		if ( (f->p = str_copy(s)) != NULL )
    		{
    			if ( (f->s = file_to_string_2(s)) != NULL )
    			{
    				f->l = file_length(s);
    				keep_allocs = 1; /*Succès!*/
     
    				if(!keep_allocs)
    					free(f->s), f->s=NULL;
    			}
     
    			if(!keep_allocs)
    				free(f->p), f->p=NULL;
    		}
     
    		if(!keep_allocs)
    			free(f), f=NULL;
    	}
     
    	return f;
    }
    J'oubliais ! je ne comprends pas cette partie de votre code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const t_file fInit = {0};
    *f = fInit;
    Cdt.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  20. #40
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    La ligne const t_file fInit = {0}; crée une structure t_tfile avec tous les champs à zéro de manière portable (sur certaines plate-formes, zéro ne signifie pas forcément "tous les bits à zéro")
    La ligne suivante *f = fInit; recopie ça dans la structure allouée.

    En gros, c'est une version plus portable de memset(f, 0, sizeof(*f)), ou d'un appel à calloc().

    Edit: Pour bien faire, on pourrait mettre ça dans une ou deux fonctions:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void file_init0(t_file *f)
    {
    	const t_file fInit = {0};
    	*f = fInit;
    }
     
    t_file* file_new0()
    {
    	t_file *f = malloc(sizeof *f);
    	if(f != NULL)
    		file_init(f);
    	return f;
    }
     
    ...
     
    /*Dans la fonction file_create()*/
    	if ( (f = file_new0()) != NULL )
    	{
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [WD12] Erreur allocation mémoire
    Par Christophe Charron dans le forum WinDev
    Réponses: 12
    Dernier message: 08/10/2012, 08h55
  2. Réduction dans le systray pour libérer mémoire
    Par mickmix69 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 04/01/2008, 09h47
  3. Erreur allocation memoire
    Par insa59 dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 03/04/2007, 09h59
  4. Erreur Allocation mémoire
    Par Thordax dans le forum C++
    Réponses: 10
    Dernier message: 05/04/2006, 21h29
  5. ADO :Erreur allocation
    Par charliejo dans le forum C++Builder
    Réponses: 4
    Dernier message: 22/02/2006, 10h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo