libération mémoire

libération mémoire - C - Programmation

Marsh Posté le 05-12-2015 à 03:38:34    

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

Reply

Marsh Posté le 05-12-2015 à 03:38:34   

Reply

Marsh Posté le 05-12-2015 à 14:32:52    

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é!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed