Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
1755 connectés 

  FORUM HardWare.fr
  Programmation
  C

  libération mémoire

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

libération mémoire

n°2270822
caps lock
Posté le 05-12-2015 à 03:38:34  profilanswer
 

Dans un tel cas où je dois allouer de la mémoire dans une fonction qui doit retourner un tableau, je ne cerne pas trop comment libérer cette mémoire ainsi allouée  

Code :
  1. char** function(char* command, int *number);
  2. int main(int argc, char** argv)
  3. {
  4.   int number;
  5.   char *commande;
  6.   commande = argv[1];
  7. char** tab = function(command, &number);
  8. /*si je libère tab ici c'est bon ?*/
  9.   return 0;
  10. }
  11. char** function(char* command, int* number)
  12. {
  13.   int index = 0;
  14.   char **array;
  15.   /***du code, la valeur de index évolue***/
  16.   array = malloc(sizeof(char*) * index);
  17. /****dans une boucle****/
  18.   array[index] = malloc(sizeof(char) * strlen(string));
  19.   return array;
  20. /*je retourne array, que je ne peux donc pas liberer*/
  21. }


 
Comment doit-on procéder pour faire les choses proprement ? déclarer le tableau qui passera en paramêtre de la fonction, afin de libérer la mémoire à la fin du main ?  
Merci

mood
Publicité
Posté le 05-12-2015 à 03:38:34  profilanswer
 

n°2270826
gilou
Modérateur
Modzilla
Posté le 05-12-2015 à 14:32:52  profilanswer
 

Pour faire ça proprement, c'est OK a condition que tu libères ça proprement quand tu n'en a plus besoin (dans une boucle, free(tab[index]) puis free(tab)).
Mais ça nécessite que tu connaisse la valeur de index en dehors de function (ou bien que tu alloues index+1 éléments et que tu mettes le dernier à NULL, comme indicateur de fin, et que aucun des autres array[index] ne soit à NULL)
Mais j'ai donné une solution plus simple récemment si les lignes de ton tableau sont de taille fixe (pas clair au vu de ton exemple si ton strlen(string) est constant ou variable) et que tu ne fais pas de réallocation:
 

Citation :

Une fonction, et avec une seule allocation:

Code :
  1. // dans une fonction c'est mieux, surtout qu'on retourne un pointeur, ce qui est optimal
  2. double** double_dynamicArray2D(int x, int y) {
  3.   double** array = (double **) malloc((x * sizeof(double*)) + (x*y * sizeof(double)));
  4.   if (array) {
  5.       int i;
  6.       for (i = 0; i < x; ++i) {
  7.         array[i] = (double*)(array + x) + i * y;
  8.       }
  9.   }
  10.   return array;
  11. }
  12. // Et on fait dans son code
  13. double** tab = double_dynamicArray2D(25, 100);
  14. // a ce stade, on peut employer tab comme un tableau
  15. ...
  16. free(tab);

La fonction fait une allocation unique (on colle les pointeurs en premier et les données derrière), et le gros avantage, c'est qu'un unique free suffit à libérer la mémoire.


C'est peut être adaptable à ton cas de manière simple. (si les lignes de ton tableau ne sont pas de taille fixe, c'est faisable mais nettement moins simple).
 
A+,


Message édité par gilou le 05-12-2015 à 14:41:41

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  libération mémoire

 

Sujets relatifs
vector libération mémoireLibération de la mémoire sous Excel 2002
[Rails] Libération de la mémoirelibération de mémoire & organisation hiérarchique de classes
Libération de la mémoire[opengl]Pb: liberation mémoire textures [RESOLU]
Modification des argv[i] et libération de la mémoireliberation memoire
[VBS] [Résolu] Libération mémoire d'objet WORDFreeImage liberation memoire
Plus de sujets relatifs à : libération mémoire


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR