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

  FORUM HardWare.fr
  Programmation
  C

  Fuite mémoire tableau double entrée..

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fuite mémoire tableau double entrée..

n°1906167
jijiz
Posté le 17-07-2009 à 14:24:02  profilanswer
 

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.

mood
Publicité
Posté le 17-07-2009 à 14:24:02  profilanswer
 

n°1906176
theshockwa​ve
I work at a firm named Koslow
Posté le 17-07-2009 à 14:57:52  profilanswer
 

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
n°1906183
jijiz
Posté le 17-07-2009 à 15:10:11  profilanswer
 

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
n°1906192
jijiz
Posté le 17-07-2009 à 15:30:13  profilanswer
 

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

n°1906282
Elmoricq
Modérateur
Posté le 18-07-2009 à 00:00:26  profilanswer
 

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
n°1906291
Joel F
Real men use unique_ptr
Posté le 18-07-2009 à 07:54:19  profilanswer
 

et surtout pourquoi faire une alloc discontinue :s

n°1906310
jijiz
Posté le 18-07-2009 à 10:57:31  profilanswer
 

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".

n°1906316
Joel F
Real men use unique_ptr
Posté le 18-07-2009 à 11:25:01  profilanswer
 

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

n°1906588
jijiz
Posté le 20-07-2009 à 08:26:57  profilanswer
 

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
n°1906616
Joel F
Real men use unique_ptr
Posté le 20-07-2009 à 09:48:53  profilanswer
 

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.

mood
Publicité
Posté le 20-07-2009 à 09:48:53  profilanswer
 

n°1906625
jijiz
Posté le 20-07-2009 à 10:04:02  profilanswer
 

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

n°1907153
Taz
bisounours-codeur
Posté le 21-07-2009 à 12:03:15  profilanswer
 

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

n°1907158
jijiz
Posté le 21-07-2009 à 12:16:06  profilanswer
 

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

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

  Fuite mémoire tableau double entrée..

 

Sujets relatifs
récupération d'un fichier txt en tableau phpPetites images et grandes images...
La mémoire ne peut pas être readInserer un tableau dans du php, probleme
Problème image dans tableau[html] coller une image a un tableau
Macro excel 2007 remplir tableau recap[C/C++] Difference entre pointeur et double pointeur ?
Tableau de commande sql a interpreterTravailler avec des bits pour réduire la mémoire
Plus de sujets relatifs à : Fuite mémoire tableau double entrée..


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