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 :

autre éclaircissement sur free


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Points : 22
    Points
    22
    Par défaut autre éclaircissement sur free
    Bonjour,

    Le code suivant me semble syntaxiquement valide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int buffer_size= 10;
    char* buffer1;
    char* buffer2;
     
    buffer1=( char*) malloc( buffer_size* sizeof( char));
    buffer2= buffer1;
    free( buffer2);
    /* il est entendu qu'a partir de maintenant
    free( buffer1);
    est au moins inutile, voire générateur d'erreur ou pire */
    Mais est-il fonctionnel ? Est-il complet ?

    Merci de votre attention.

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Salut,

    ce code est effectivement syntaxiquement valide, et devrait fonctionner tel quel, mais est très dangereux : après le free(buffer2), tu auras une erreur d'exécution (segmentation fault) si tu fais :

    • free(buffer1) ; // car la mémoire de buffer1 a déjà été libérée, mais buffer1 != NULL
    • free(buffer2); // idem

    et tu auras peut etre une erreur, peut etre pas, en tout cas le comportement est indéterminé, si tu fais :

    • buffer[1] = 'x'; // car la mémoire n'est plus allouée, mais peut quand meme être disponible, ou pas
    • idem pour buffer2

    Une pratique plus sur serait quelque chose de ce genre (totalement inutile pour le moreau de code seul, mais à adapter)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int buffer_size= 10;
    char* buffer2 = NULL;    // buffer2 est accessible partout
    
    {
       char* buffer1;        // buffer1 n'est acessible que dans ce bloc
       buffer1=( char*) malloc( buffer_size* sizeof( char));
       buffer2= buffer1;
    }
    
    // ici free(buffer1) provoque une erreur de compilation
    
    free( buffer2), buffer2 = NULL;
    
    // ici free(buffer2) ne provoque pas d'erreur, car free(NULL) est valide
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Merci beaucoup pour ton attention ainsi que tes commentaires très instructifs... je connaissais pas l'utilisation de {} pour définir un espace de validité. Ou plutôt, je n'avais pas conscience de son sens en ces termes . Même si, à la réflexion, çà parait presque trivial ... Faut m'excuser, j'ai jamais écrit de compilateur C ...
    J'ai bien conscience du coté dangereux, je fais ça dans un cas 'extreme' : Je suis en train de remplir, à partir d'un fichier texte, un tableau de structure contenant des mallocs ; le tableau, géré via pointeur, étant lui même un malloc.
    Or, au cours du chargement de mon tableau, je détecte un 'meilleur doublon' comme nouvel élément du tableau. Je désalloue les mallocs du 'mauvais doublon' et je memcpy le meilleur doublon à l'adresse du 'mauvais', d'où ma question initiale qui concernait les désallocations futures associées au contenu du 'meilleur doublon'.
    Je me rend compte à la rédaction de ce commentaire, que je vais être confronté à la situation suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int buffer_size= 10;
    char* buffer1;
    char* buffer2;
     
    buffer1=( char*) malloc( buffer_size* sizeof( char));
    buffer2= buffer1;
    buffer1=( char*) malloc( buffer_size* sizeof( char)); /* là est ma crainte */
     
    /* pour la complétude */
    free( buffer2);
    free( buffer1);
    Est-ce fonctionnel ? Est-ce complet ? (il me semble que oui ... )

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Oui c'est fonctionnel et complet, il n'y a vraiment rien de choquant la dedans . Tu libères bien les deux zones mémoires que tu as allouées.
    Quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer1=( char*) malloc( buffer_size* sizeof( char));
    la deuxième fois, tu alloues un espace mémoire nouveau, et tu fais pointer dessus buffer1, ce qui pourrait entrainer que tu ne pourrais plus avoir accès à l'espace mémoire créé en premier, mais ce n'est pas le cas, puisque buffer2 pointe dessus .

    Si tu as un doute, tu peux (sous linux, sous windows il y'a forcément un équivalent mais je connais pas) utiliser un outils comme valgrind, qui t'indiquera à l'exécution si tu as des fuites de mémoire, si tu fais des accès mémoire incorrects etc. C'est un très bon outils.

    Si tu veux, tu peux poster le code pour lequel tu as un doutes, et on regardera
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Merci beaucoup.

    Encore une incertitude levée grâce à la C(un)Ltd. !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. un petit éclaircissement sur free()
    Par minibus dans le forum Débuter
    Réponses: 9
    Dernier message: 29/07/2009, 10h35
  2. [FPDF] Générer PDF ou autre sur Free
    Par wadcyr8_197 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 08/03/2007, 20h48
  3. forcer la création de tables InnoDB sur Free
    Par Eldarion dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 13/10/2005, 22h23
  4. Récuperer les fichiers d'une autre machine sur une autre
    Par khalidlyon dans le forum Réseau
    Réponses: 1
    Dernier message: 09/11/2004, 13h40
  5. mysqldump sur free
    Par bouba64 dans le forum Administration
    Réponses: 4
    Dernier message: 15/07/2003, 17h10

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