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 :

[Pointeurs] Prob avec free()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2003
    Messages : 28
    Par défaut [Pointeurs] Prob avec free()
    Bonjour à tous,

    Je débute en C et je dois réaliser un programme de cryptage RSA donc je manipule des tableaux d'int afin de pouvoir utiliser des entiers de l'ordre de 1024bits.

    J'ai donc plusieurs fonctions qui font des calculs sur ces entiers et donc j'ai de nombreux malloc.

    Ma question est la suivante : comment libérer la mémoire réservée par un malloc si la fonction retourne l'objet stocké dans cette mémoire ? Je m'explique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    type1 * addition ( type1 * A, type1 * B)
    {
        type1 * C;
        /* le code */
        C = (type1 *) malloc (sizeof(type1));
        C->taille = a;
        C->valeur = (int *) malloc (C->taille*sizeof(int));
        /* la suite du code */
        return C;
    }
    Avec cette fonction où dois je placer le free(C) ?

    Merci d'avance de votre aide,
    Mickael

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Dans la fonction qui appelle la fonction addition()

    PS: On ne caste pas le retour de malloc() en C.
    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.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par DjTechno Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type1 * addition ( type1 * A, type1 * B)
    {
        type1 * C;
        /* le code */
        C = (type1 *) malloc (sizeof(type1));
        C->taille = a;
        C->valeur = (int *) malloc (C->taille*sizeof(int));
        /* la suite du code */
        return C;
    }
    Dans ton code, tu fais "C->taille = a;". a n'est pas défini dans ta fonction addition() (ou alors, c'est une variable globale, c'est pas bien !!).

    Sinon, pour résoudre ton problème et comme ta structure est un tout petit peu complexe, je ferai bien une fonction libere_struct() chargée de libérer les membres.
    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
     
    void libere_struct(type1 * * ptr)
    {
       if(ptr == NULL) return;
       type1 *p2 = *ptr;
       if(p2 == NULL) return;
       if(p2->valeur != NULL) free(p2->valeur);
       free(p2);
     
       *ptr = NULL;
    }
     
    void main(void)
    {
    type1 *p;
       ...
       libere_struct(&p);
       ...
     
    }
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Attention, ceci n'est vrai que si valeur a une taille variable. Mais si cette taille est fixe et connue, ou s'il y a un maximum d'une longueur raisonnable, on peut très bien déclarer un tableau de taille fixe faisant partie intégrante de la structure.

    Comme précisé dans un autre post, si l'on définit un tableau dans une structure, il sera inscrit en entier dans chaque instance de celle-ci. Donc, dans le cas présent, aucun malloc() à faire.

    On instancie la structure dans la pile en remplaçant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type1 * c;
     
    c->taille =
    c->valeur =
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type1 c;
     
    c.taille =
    Et on exploite directement c.valeur qui est forcément initialisé. Ensuite, un

    ... suffit, et on abstrait complètement la gestion de la mémoire.

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    <...>
    Et on exploite directement c.valeur qui est forcément initialisé. Ensuite, un

    ... suffit, et on abstrait complètement la gestion de la mémoire.
    Oui, mais ça dépend la taille de la structure. La recopie peut très bien faire baisser les performances; Ca dépend aussi de la place de cette fonction dans l'algorithme qui l'utilise. Si elle est appelée 1 fois par seconde, c'est pas les mêmes problèmes que si elle est appelée 500.000 fois par secondes...

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Oui, mais ça dépend la taille de la structure. La recopie peut très bien faire baisser les performances; Ca dépend aussi de la place de cette fonction dans l'algorithme qui l'utilise. Si elle est appelée 1 fois par seconde, c'est pas les mêmes problèmes que si elle est appelée 500.000 fois par secondes...
    C'est certain mais à mon avis :

    - Ce sera toujours moins long qu'un malloc()/free() ;
    - C'est pour cela que j'ai bien précisé « s'il y a un maximum d'une longueur raisonnable ». Dans la plupart des cas, ça ne dépasse pas 4096 bits.

    D'autre part, la structure peut être recopiée une fois vers une autre instance de la fonction appelante, sur laquelle ladite fonction travaillera 500.000 fois. C'est un cas de figure somme toutes assez courant ...

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par DjTechno Voir le message
    Bonjour à tous,

    Je débute en C et je dois réaliser un programme de cryptage RSA donc je manipule des tableaux d'int afin de pouvoir utiliser des entiers de l'ordre de 1024bits.

    J'ai donc plusieurs fonctions qui font des calculs sur ces entiers et donc j'ai de nombreux malloc.

    Ma question est la suivante : comment libérer la mémoire réservée par un malloc si la fonction retourne l'objet stocké dans cette mémoire ? Je m'explique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    type1 * addition ( type1 * A, type1 * B)
    {
        type1 * C;
        /* le code */
        C = (type1 *) malloc (sizeof(type1));
        C->taille = a;
        C->valeur = (int *) malloc (C->taille*sizeof(int));
        /* la suite du code */
        return C;
    }
    Avec cette fonction où dois je placer le free(C) ?

    Merci d'avance de votre aide,
    Mickael
    Si tu dois vraiment faire une allocation dynamique, avec ce qu'a répondu Médinoc, tu obtiens :

    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
     
    type1 * addition ( type1 * A, type1 * B)
    {
        type1 * C;
        /* le code */
        C = malloc (sizeof(type1));
        if(C == NULL) return NULL;
        C->taille = a;
        C->valeur = malloc (C->taille*sizeof(*C->valeur));
        if(C->valeur == NULL)
       {
         free(C); C=NULL; retun NULL;
       }
        /* la suite du code */
        return C;
    }
    puis tu as une fonction (à améliorer avec des tests d'erreur et la libération e la mémoire):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int bidon(int a,int b)
    {
    /* tu crées tes variables A et B */
      type1 * A = CreateType1(blabla);
      type1 * B = CreateType1(blabla);
    type1 * C =addition(A,B);
    free(C); C = NULL;
    return 0;
    }

Discussions similaires

  1. [débutant] Prob avec Tree ctrl
    Par Devether dans le forum MFC
    Réponses: 3
    Dernier message: 24/03/2004, 11h36
  2. [composant][MX_2004_pro] prob avec scrollpane
    Par scorpiwolf dans le forum Flash
    Réponses: 6
    Dernier message: 12/01/2004, 20h18
  3. Prob avec dates delphi
    Par ericmart dans le forum ASP
    Réponses: 6
    Dernier message: 20/10/2003, 17h51
  4. prob avec utilisation de package
    Par martijan dans le forum Modules
    Réponses: 13
    Dernier message: 11/07/2003, 09h37
  5. Thread probs avec WaitFor()
    Par pixelrock dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/11/2002, 09h40

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