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 :

Gestion des erreurs, allocation dynamique


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 13
    Points
    13
    Par défaut Gestion des erreurs, allocation dynamique
    Bonjour,
    j'ai lu qu'il était fortement conseillé de libérer les variables allouées dynamiquement en utilisant la fonction free, lorsque celles-ci n'étaient plus utilisées, et ceci en particulier juste avant que le programme se termine.
    Toutefois, j'aimerais savoir ce qu'il en est dans le cas où le programme se termine avec un "statut d'erreur". C'est à dire, si avant de faire un exit(EXIT_FAILURE) il était recommandé de libérer toutes les variables avec free (ce qui compliquerait beaucoup le code dans certains cas).

    Merci par avance.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    Bonjour,
    j'ai lu qu'il était fortement conseillé de libérer les variables allouées dynamiquement en utilisant la fonction free, lorsque celles-ci n'étaient plus utilisées, et ceci en particulier juste avant que le programme se termine.
    Toutefois, j'aimerais savoir ce qu'il en est dans le cas où le programme se termine avec un "statut d'erreur". C'est à dire, si avant de faire un exit(EXIT_FAILURE) il était recommandé de libérer toutes les variables avec free (ce qui compliquerait beaucoup le code dans certains cas).

    Merci par avance.
    C'est d'ailleurs une des raisons pour lesquelles je ne suis pas trop ami avec la fonction exit. J'ai l'impression que de plus en plus de codeurs utilisent cette fonction, par facilité (pour éviter structurer correctement leur programme) et de manière un peu abusive, dès le moindre pépin, par exemple si un malloc ou un fopen échoue.
    Il y a peut-être des cas où exit est utile, recommandé voire nécessaire (je ne sais pas, je n'ai pas la connaissance absolue non plus...), mais je constate qu'il est quand même utilisé un peu trop facilement.

    Moi, je suis plutôt "branché" par les programmes un minimum structurés, de manière logique et cohérente, qui gèrent les erreurs, dans le sens où je considère que chaque fonction doit avoir un rôle spécifique et retourner une valeur (si nécessaire) indiquant à la fonction appelante si cela a réussit ou non. Et si erreur il y a, la fonction appelante la gère, ou bien la fait gérer par celle qui l'a appelée, etc. Histoire de remonter, comme une pyramide, vers le sommet jusqu'à ce qu'on ait géré proprement le problème (par "géré", je ne dis pas forcément "réparé"). Je trouve que ça fais plus propre.
    Enfin, ce n'est que ma vision personnelle de la programmation, qui n'engage que moi.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 42
    Points
    42
    Par défaut
    Cela pose-t'il un probleme d'utiliser souvent exit pour gérer les erreurs ?

  4. #4
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Je connais des gens qui disent que les OS modernes libèrent automatiquement la mémoire, et que tu coup les free sont useless. D'un côté il a pas tord si on programme pour win, nux, ou mac mais si on veut faire de l'embarqué je pense que ça a son importance.
    Je ne connais pas trop l'embarqué, mais je pense qu'un free non fait est utiliser de la mémoire pour rien une fois le programme terminé.

    @ Flynet : Je suis de l'avis de jeroman, a savoir ne pas en abuser.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 42
    Points
    42
    Par défaut
    Abusif ? Je pense a des erreurs d'ouvertures de fichiers ou d'initialisation de bibliotheques... Mais cela-a-t'il des consequences d'utiliser souvent exit ?

  6. #6
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Ca a des conséquences si tu veux que ça en aie. Ca dépend de ton programme, si un fichier n'est pas chargé est-ce que tu quittes ton programme, ou est-ce que tu affiches un message comme quoi tu n'as pas pu ouvrir le fichier et tu fais autre chose, ou tu reviens à l'étape d'avant ? (ambiguë comme phrase )

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 42
    Points
    42
    Par défaut
    Oui certes mais j'aimerai savoir quel genre de probleme cela peut provoquer ?

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par mach1 Voir le message
    Bonjour,
    j'ai lu qu'il était fortement conseillé de libérer les variables allouées dynamiquement en utilisant la fonction free, lorsque celles-ci n'étaient plus utilisées, et ceci en particulier juste avant que le programme se termine.
    Toutefois, j'aimerais savoir ce qu'il en est dans le cas où le programme se termine avec un "statut d'erreur". C'est à dire, si avant de faire un exit(EXIT_FAILURE) il était recommandé de libérer toutes les variables avec free (ce qui compliquerait beaucoup le code dans certains cas).

    Merci par avance.
    Citation Envoyé par Flynet Voir le message
    Abusif ? Je pense a des erreurs d'ouvertures de fichiers ou d'initialisation de bibliotheques... Mais cela-a-t'il des consequences d'utiliser souvent exit ?
    Citation Envoyé par Flynet Voir le message
    Oui certes mais j'aimerai savoir quel genre de probleme cela peut provoquer ?

    Laisses-tu toutes les portes ouvertes et les lumières allumées quand tu rentres et sort de quelque part ?



    C'est pas "dangereux" a priori (quoique c'est se fier au bon vouloir de l'OS, ce qui n'est pas une bonne chose, en particulier si on a affaire à un OS un peu exotique, (temps réel, embarqué, etc)..

    Mais c'est surtout une très mauvaise habitude pour tout un tas de raisons..


    • Si un jour tu veux transformer ton programme (ou une partie du programme) en fonction, il faudra que tu repasses à travers tout le code pour savoir ce que tu avais alloué pour le libérer..

    • Si un jour tu veux ajouter quelque chose , même chose.

    • C'est incorrect et rend le code non professionnel.

  9. #9
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    Oui certes mais j'aimerai savoir quel genre de probleme cela peut provoquer ?
    Si tu fais du sur mesure et que tu release pas ton code, je dirais que le seul probleme va etre la tete de ton code (pour reprendre l'expression "non professionnel").

    Apres, quand on est bien eleve on free tout ce qu'on alloc, faut prendre les free automatiques du systeme comme une securite et pas un outil (une boucle infinie sur un malloc est tellement vite arrivee ).

    Donc pour repondre a ta question: n'utilise jamais exit quand tu as le choix, ca te permet de faire une gestion d'erreurs potable (entre autres).

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Tout à fait, je partage votre point de vue : à chaque *alloc correspond un free, bien faire un ptr = NULL après un free, d'où ma macro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #define FREE(p)\
    do\
    {\
      free(p);\
      p = NULL;\
    }\
    while(0)
    Efin, priviliégier des fonctions qui renvoient des indicateurs d'erreur et les remonter jusqu'au mail()

  11. #11
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par salseropom Voir le message
    Enfin, privilégier des fonctions qui renvoient des indicateurs d'erreur et les remonter jusqu'au mail()
    Je suppose que tu voulais écrire main() ?

    Ceci étant pourquoi privilégier ce genre de chose ? Pourquoi ne pas tout simplement traiter l'erreur là où il est pertinent de le faire (ce qui peut être dans le main() - typiquement dans le cas où l'on souhaite tout simplement arrêter le programme -, localement ou dans une fonction intermédiaire selon les cas) plutôt que de la remonter dans le main ?

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par gl Voir le message
    Je suppose que tu voulais écrire main() ?

    Ceci étant pourquoi privilégier ce genre de chose ? Pourquoi ne pas tout simplement traiter l'erreur là où il est pertinent de le faire (ce qui peut être dans le main() - typiquement dans le cas où l'on souhaite tout simplement arrêter le programme -, localement ou dans une fonction intermédiaire selon les cas) plutôt que de la remonter dans le main ?
    oui tout à fait, je voulais parler de main(). Pardon pour la faute de frappe. Sinon, je remonte l'erreur jusqu'au main() pour ensuite libérer correctement toute la mémoire. Mais bien sûr, l'erreur est traitée dans la fonction qui a renvoyé l'erreur.

Discussions similaires

  1. Gestion des erreurs en dynamique
    Par martin_alexandre_fr dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 05/11/2013, 15h56
  2. Problème de sélection dans un tableau dynamique (gestion des erreurs)
    Par aulilou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/08/2007, 16h38
  3. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 11h20
  4. [XSLT]Est ce qu'il y'a la gestion des erreur en xslt ?
    Par miloud dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 04/02/2004, 17h19
  5. [LG]gestion des erreurs
    Par frontin dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2003, 22h41

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