Fuite mémoire tableau double entrée..

Fuite mémoire tableau double entrée.. - C - Programmation

Marsh Posté le 17-07-2009 à 14:24:02    

Bonjour,
 
CodeGuard me signale que je ne libère pas mon pointeur à la sortie du programme..
J'ai simplement un tableau à double entrée :
 
 

Code :
  1. char **pcTest;
  2. pcTest = (char **)malloc(32*32*sizeof(char*));
  3. for ( int i = 0; i < 32; i++ ){
  4.  pcTest[i] = (char *)malloc(32*sizeof(char));
  5.  strcpy(pcTest[i],"" );
  6. }


 
... plus loin dans le code :
 

Code :
  1. for ( int i = 0; i < 32; i++ ){
  2.                 free(pcTest[i]);
  3.  pcTest[i] = NULL;
  4. }
  5. if (pcTest != NULL ){
  6.  free(pcTest );
  7.  pcTest = NULL;
  8. }


 
 
WTF? :)
 
Merci pour vos lumières.

Reply

Marsh Posté le 17-07-2009 à 14:24:02   

Reply

Marsh Posté le 17-07-2009 à 14:57:52    

c'est volontaire, de faire un tableau de 1024 pointeurs sur des tableaux de 32 caractères ?
 
le strcpy d'une chaine vide me semble un peu douteux, si tu veux mettre le premier de ton caractères à 0, c'est aussi simple de le faire à la main.
 
Pour ce qui est de l'allocation / libération de la mémoire, ca m'a l'air ok au premier coup d'oeil, tu as moyen de faire un exemple minimal mais complet (compilable) qui reproduit ton problème ?


---------------
last.fm
Reply

Marsh Posté le 17-07-2009 à 15:10:11    

theshockwave a écrit :

c'est volontaire, de faire un tableau de 1024 pointeurs sur des tableaux de 32 caractères ?
 
le strcpy d'une chaine vide me semble un peu douteux, si tu veux mettre le premier de ton caractères à 0, c'est aussi simple de le faire à la main.
 
Pour ce qui est de l'allocation / libération de la mémoire, ca m'a l'air ok au premier coup d'oeil, tu as moyen de faire un exemple minimal mais complet (compilable) qui reproduit ton problème ?


 
 
Hmmm, j'ai voulu faire un tableau à double entrée (32*32). Le tableau doit contenir :
 
"Chaine1\0"
"Chaine2\0"
"Chaine3\0"
 
J'ai faux?? Je remplace mon 32*32 par 32 et voici le programme :
 
Bizarre ça passe sans erreur..
 
 

Code :
  1. char **pcParamsNonTrouves;
  2. pcParamsNonTrouves = (char **)malloc(32*sizeof(char*));
  3. for ( int i = 0; i < 32; i++ ){
  4.  pcParamsNonTrouves[i] = (char *)malloc(32*sizeof(char));
  5.  strcpy(pcParamsNonTrouves[i],"" );
  6. }
  7. for ( int i = 0; i < 32; i++ ){
  8.         free(pcParamsNonTrouves[i]);
  9.  pcParamsNonTrouves[i] = NULL;
  10. }
  11. if (pcParamsNonTrouves != NULL ){
  12.  free(pcParamsNonTrouves );
  13.  pcParamsNonTrouves = NULL;
  14. }


 
 
je sens un return impromptu que je n'ai pas anticipé entre le malloc et le free (je touche du code qui n'est pas la miens)


Message édité par jijiz le 17-07-2009 à 15:28:35
Reply

Marsh Posté le 17-07-2009 à 15:30:13    

c'est bien cela, il y a des return avant mon free.
 
Merci et désolé pour le dérangement

Reply

Marsh Posté le 18-07-2009 à 00:00:26    

Petites remarques rapides :

  • pas besoin de caster le retour de malloc()
  • Tu testes si pcTest est différent de NULL avant de l'effacer, mais pas avant d'en effacer les éléments. Il faut que le test englobe également la boucle de free(). Idem pour pcParamsNonTrouves.
  • N'oublie pas de tester le retour de malloc(), pour vérifier que l'allocation mémoire s'est bien déroulée, et d'agir en fonction dans le cas contraire
  • Tu peux utiliser calloc() pour initialiser la mémoire allouée à 0, ce qui t'évitera le strcpy()
  • hors cas particuliers, une allocation dynamique de taille fixe semble douteuse, pourquoi ne pas utiliser directement un tableau ?  ;)


Message édité par Elmoricq le 18-07-2009 à 00:01:26
Reply

Marsh Posté le 18-07-2009 à 07:54:19    

et surtout pourquoi faire une alloc discontinue :s

Reply

Marsh Posté le 18-07-2009 à 10:57:31    

Joel F a écrit :

et surtout pourquoi faire une alloc discontinue :s


Je prends en compte toutes vos remarques merci. Cependant, peux tu développer ce qu'est "une alloc discontinue".

Reply

Marsh Posté le 18-07-2009 à 11:25:01    

un tableau 2D allouée avec 2 passes de malloc.

Reply

Marsh Posté le 20-07-2009 à 08:26:57    

Joel F a écrit :

un tableau 2D allouée avec 2 passes de malloc.


tu peux me montrer/m'expliquer comment faire une allocation continue, car j'ai tout le temps fait ainsi? Merci


Message édité par jijiz le 20-07-2009 à 08:27:10
Reply

Marsh Posté le 20-07-2009 à 09:48:53    

http://codepad.org/K2WAwRBP
 
Ca c'ets la base pour ls tableaux de taille fixe sur les lignes oules colonns.
Pour des tabelaux à tailles de lignes ou de colonnes variables, l'adaptation de alloc_array est triviale.

Reply

Marsh Posté le 20-07-2009 à 09:48:53   

Reply

Marsh Posté le 20-07-2009 à 10:04:02    

Merci :). Je ne connaissais pas du tout, et mes profs non plus..

Reply

Marsh Posté le 21-07-2009 à 12:03:15    

Euh c'est quoi le nom de ton lycée ?

Reply

Marsh Posté le 21-07-2009 à 12:16:06    

Taz a écrit :

Euh c'est quoi le nom de ton lycée ?


Euh, tu es très marrant toi.
 
Ta réponse ne m'étonne pas... bien que tu sois un membre très actif, ton arrogance m'irrite légèrement.
 
Merci à ceux qui m'ont aidé


Message édité par jijiz le 21-07-2009 à 12:19:18
Reply

Sujets relatifs:

Leave a Replay

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