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 :

Malloc et retour de fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de zentaf
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Par défaut Malloc et retour de fonction
    Bonjour à tous,

    J'ai écrit une fonction char * str_ext(char *ch, int start, int end) qui extrait une sous chaine de la chaine d'origine selon les indices. La fonction retourne la sous chaine. J'utilise l'allocation dynamique avec malloc mais je suis obligé de ne pas faire de free() dans ma fonction, je laisse ça à l'utilisateur de ma fonction (chose que j'aime pas trop).

    Pour ce souci, je me demande :

    Si l'utilisateur utilise la fonction de la manière suivante,
    est-ce qu'on doit faire un free() aussi? si oui comment?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *ch = "Bonjour à tous !";
    char s1[255]="";
    strcpy(s1,str_ext(ch,0,6));
    Rq: admettons que s1 est toujours suffisamment grande pour accueillir la sous chaine.

    au lieu de :

    Merci,
    zentaf.

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Ca va leaker...
    Tu perds le pointeur qui a été alloué dans str_ext.
    C'est pour ça qu'il "faudrait" faire comme strcpy : demander un tableau de la bonne taille "avant" d'exécuter ton code.

    Mais le but du C et des str*, c'est justement que l'utilisateur gère à sa guise la mémoire ! ^^'
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    est-ce qu'on doit faire un free() aussi?
    Tu réponds toi même à ta question :
    free()[...], je laisse ça à l'utilisateur de ma fonction
    L'utilisateur ne fait pas de free() dans ton exemple, il y a donc une fuite mémoire.

    si oui comment?
    En passant par une variable intermédiaire pour stocker le pointeur retournée par la fonction. Ensuite, tu fais le strcpy() et enfin le free(). Les précautions pour utiliser ta fonction sont les mêmes pour que utiliser strdup().

  4. #4
    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
    Allocation dynamique = libération, tu ne peux pas passer à côté !

    Maintenant, si tu fait une bibliothèque pour gérer les chaînes de caractères, si c'est un gros projet qui englobe peut-être même un plus gros projet, pourquoi ne pas mettre en place une liste chaînée qui garderais la trace de chaque allocations dynamiques. Au chargement du programme, tu appelles (au bon moment mais c'est à toi de le choisir suivant comment tu fais les initialisations primaires) la fonction atexit() dans la quelle tu renseigne une fonction qui va libérer chaque adresse contenue dans ta liste puis pour finir ta liste. Au moment de la fermeture du programme, si l'utilisateur à oublié de libérer certaines choses bin c'est le programme qui s'en occupe.

    Bon je le concède, ça fait pas mal de boulot en plus mais tu peux t'en faire un module réutilisable et l'utiliser pour d'autres projets, je l'ai déjà fait à une époque et c'est prévu en interne à ma bibliothèque de chaînes de caractères (voir ma signature).

    Sinon laisser le soin à l'utilisateur de le faire (de toute manière vaut mieux laisser un moyen de le faire) mais si après y'a des fuites mémoire ce sera pas de ta faute
    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 !

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    A la fin de l'exécution du programme, toutes les ressources mémoires sont libérées ( si je ne dis pas de bêtises ) mais d'autres ressources peuvent ne pas l'être (sémaphore système V ?). Libérer la mémoire avec un atexit() me semble donc un peu superflu.

    Surtout que cette méthode sera inefficace si on recouvre (avec par exemple exec()) le programme par un autre (la mémoire restera allouée il me semble).

    Après, c'est aussi une question de méthode :
    Dès qu'on récupère un pointeur, on se demande s'il faut le désallouer ou non, etc. Et si on a quand même des problèmes de désallocation, Valgrind est là pour nous aider

  6. #6
    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
    Pour la libération c'est selon le système donc il faut partir du principe qu'il ne le fait pas car la norme ne garantie rien à ce niveau
    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 !

Discussions similaires

  1. Perte de type en retour de fonction
    Par Bebel dans le forum Langage
    Réponses: 8
    Dernier message: 22/12/2005, 12h54
  2. [syntaxe] tableau et retour de fonction
    Par BainE dans le forum C++
    Réponses: 4
    Dernier message: 08/12/2005, 16h01
  3. Retour de fonction en C
    Par troumad dans le forum Linux
    Réponses: 2
    Dernier message: 06/11/2005, 21h43
  4. Utilisation d'un retour de fonction dans un decode
    Par CFVince dans le forum Oracle
    Réponses: 4
    Dernier message: 20/10/2005, 17h22
  5. Référence en retour de fonction, à transformer en hash
    Par raoulchatigre dans le forum Langage
    Réponses: 4
    Dernier message: 15/07/2005, 14h24

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