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 - Free] Comment bien les utiliser dans ce cas ?


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut [Malloc - Free] Comment bien les utiliser dans ce cas ?
    Bonjour tout le monde,

    Je suis actuellement en plein dilemne...
    En effet, je ne sais comment liberer la memoire allouee sans perdre les infos...
    J m explique, j'utilise une fonction qui me retourne un " pointeur sur un unsigned integer (uint_T*)" et j alloue de la memoire pour cela...

    Ce que j aimerais faire c est desallouer cette memoire apres avoir recolte les bonnes informations...
    Je vous presente un bout de mon code :

    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
    uint_T* capi_GetDimensionsMatrix(rtwCAPI_ModelMappingInfo* capiMap, uint_T paramIdx)
    {    
        /* J ai coupe tout le code avt car il n est pas necessaire, ce ne sont que des obtentions d informations...*/
    
        actualDimensions = (uint_T *) malloc(numDims*sizeof(uint_T)); /* Voila le Malloc */
                             
        for(idx=0; idx < numDims; idx++) 
        {
            actualDimensions[idx] = dimArray[dimArrayIdx + idx];        
        }
                                             
    	return actualDimensions;
            /* et voila, ici j aimerais faire  free(actualDimensions) mais on ne va jamais apres le return... */ 
    }

    Quelqu un aurait il une solution sachant que bien evidemment je ne peux pas desallouer avt le return sinon je perds tout ce dont j ai besoin...

    Merci d avance a tous ceux qui pourront me conseiller...
    MATLAB Version 7.3.0.267 (R2006b)
    Simulink Version 6.5 (R2006b)
    Sous Windows

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    Malheureusement tu es obligé de faire désallouer la mémoire par la fonction qui appelle cette fameuse fonction...

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Ce que tu veux faire n'est pas possible.
    C'est à la fonction appelante de libérer la mémoire (eh oui malheureusement).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    uint_T* tab = capi_GetDimensionsMatrix(capiMap, paramIdx);
    // Tu travailles avec tab
    free (tab);

  4. #4
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Salut !

    Bha... Même si tu pouvais déallouer après le return, il ne faudrait pas le faire car si non la fonction qui ferais appelle à cette fonction se retrouverais avec un pointeur qui pointe quel que chose qui n'existe pas...

    En fait, ce n'est pas à cette fonction de déalloué le tableau, mais à tes fonctions qui font appelles à elle...

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void une_fonction()
    {
    ...
    uint_T* dimensions = capi_GetDimensionsMatrix(v1, v2);  // Tu récupère ton tableau
    ...
    ...
    free(dimensions );  // quand tu en a plus besoin tu lui fait un free
    ...
    }

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut
    Ok messieurs...
    Merci beaucoup pour vos reponses rapides et precises...

    Je vois que vous etes tous d accord sur la facon de resoudre ce probleme...ce qui me rassure...

    Je vais donc faire comme vous me l avez dit et desallouer au moment ou je n en ai plus besoin...

    Merci encore...
    MATLAB Version 7.3.0.267 (R2006b)
    Simulink Version 6.5 (R2006b)
    Sous Windows

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Si tu ne veux pas te soucier de faire des allocations, fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void une_fonction()
    {
    ...
    uint_T dimensions;
    capi_GetDimensionsMatrix(v1, v2, fdfd, &dimensions);  // Tu récupère ton tableau
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    uint_T* capi_GetDimensionsMatrix(rtwCAPI_ModelMappingInfo* capiMap, uint_T paramIdx, uint_T * actualDimensions)
    {    
        *actualDimensions = ...
     
     
    }
    EDIT : Désolé, j'avais pas vu que c'était un tableau
    Je ne répondrai à aucune question technique en privé

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut
    hihihi Millie c est pas grave t inquietes...

    Merci a toi de t etre arrete sur mon sujet...
    MATLAB Version 7.3.0.267 (R2006b)
    Simulink Version 6.5 (R2006b)
    Sous Windows

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

Discussions similaires

  1. [PHP 5.2] Comment retinrer les accent dans mon cas
    Par pierrot10 dans le forum Langage
    Réponses: 1
    Dernier message: 15/06/2009, 15h56
  2. Comment utiliser les datasets dans mon cas
    Par dachir dans le forum ASP.NET
    Réponses: 5
    Dernier message: 13/01/2009, 09h44
  3. Les index Firebird, comment les utiliser dans les IBX?
    Par badilou dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 31/05/2008, 23h02
  4. Comment aborder les collisions dans mon cas?
    Par MonsieurHelmut dans le forum Physique
    Réponses: 4
    Dernier message: 18/02/2007, 16h56
  5. Réponses: 2
    Dernier message: 10/08/2006, 15h58

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