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 :

Faut-il toujours mettre un free après un malloc


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Par défaut Faut-il toujours mettre un free après un malloc
    Salut, je débute en C et j'ai une interrogation sur l'allocation de mémoire :

    Voilà, je dois programmer un petit serveur qui attend des connexions de client et dans mon code je déclare une liste chaînée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct info_client *Nouveau;
    Nouveau = (struct ma_structure*)malloc(sizeof(struct ma_structure));
    Comme je ne suis pas (encore) censé gérer l'arrêt du programme, je l'arrête avec un ctrl+C, et donc je ne vois pas où mettre un free...

    Du coup je me pose deux questions :
    1) Quelles sont les conséquences si je ne mets pas de free après un malloc ? (sachant que je devrais lancer l'appli sur le serveur de la fac plusieurs fois pour le tester)
    2) Si c'est nécessaire de mettre un free, comment je peux récupérer l'événement de fin de programme ?


    Merci d'avance pour vos réponses !!

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Salut !

    Citation Envoyé par zarbiman Voir le message
    Voilà, je dois programmer un petit serveur qui attend des connexions de client et dans mon code je déclare une liste chaînée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct info_client *Nouveau;
    Nouveau = (struct ma_structure*)malloc(sizeof(struct ma_structure));
    Le cast en C n'est pas obligatoire et est même peu recommandé, voici une autre version de ton malloc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct info_client *Nouveau;
    Nouveau = malloc (sizeof (* Nouveau));
    Citation Envoyé par zarbiman Voir le message
    1) Quelles sont les conséquences si je ne mets pas de free après un malloc ? (sachant que je devrais lancer l'appli sur le serveur de la fac plusieurs fois pour le tester)
    Normalement le système sous-jacent devrait s'occuper automatiquement de la libération des ressources utilisées par un processus mais je ne préfère pas m'y fier et la libération avec free est une bonne habitude de programmation car en C, ce qu'on alloue on le libère: 1 malloc = 1 free.

    Citation Envoyé par zarbiman Voir le message
    2) Si c'est nécessaire de mettre un free, comment je peux récupérer l'événement de fin de programme ?
    Tu peux éventuellement pour le moment gérer le signal SIGINT qui est appelé lorsque tu fait un Ctrl-C donc faire la libération de la mémoire.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    Tu peux éventuellement pour le moment gérer le signal SIGINT qui est appelé lorsque tu fait un Ctrl-C donc faire la libération de la mémoire.
    Dans ce cas il faudrait aussi que le pointeur en question soit global ?

    atexit est aussi une alternative dans ce sens.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Généralement, la règle "toujours un free correspondant à un malloc()" ne s'applique pas forcément aux fins anormales du programme.

    Mais en fin normale (comme le retour du main()), toujours.
    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.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct info_client *Nouveau;
    Nouveau = (struct ma_structure*)malloc(sizeof(struct ma_structure));
    Comme c'est curieux d'allouer une struct ma_structure pour mettre son adresse dans un pointeur sur une struct info_client !

    La version de Franck.H évite de telles erreurs ou distractions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct info_client *Nouveau;
    Nouveau = malloc (sizeof * Nouveau);

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Par défaut
    Merci pour vos conseils, je vais étudier les SIGINT et atexit dès que j'aurais le temps de m'y remettre !

    Pour Diogene, c'est pas curieux c'est juste une erreur !

Discussions similaires

  1. [MySQL] Faut-il toujours un champ id autoincrement ?
    Par vg33 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 27/07/2007, 10h36
  2. mettre deux chiffres aprés la virgule
    Par anthonycosson dans le forum Langage
    Réponses: 1
    Dernier message: 10/07/2007, 16h04
  3. Faut-il toujours choisir le modem du FAI
    Par norac dans le forum Dépannage et Assistance
    Réponses: 12
    Dernier message: 25/08/2006, 16h08
  4. plantage de free après malloc
    Par Chewbi dans le forum C
    Réponses: 4
    Dernier message: 25/08/2006, 15h16
  5. Réponses: 6
    Dernier message: 27/10/2005, 12h58

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