2010-12-02 12 views
0
  int n; 
      int **arr; 
      arr = (int**)malloc(n*sizeof(int)); 
      for (i=0; i<n; ++i){ 
      arr[i] = malloc(2*sizeof(int)); 

      } 

[EDIT]comment libérer la mémoire allouée au malloc dans le code suivant?

 *** glibc detected *** ./abc: double free or corruption (out): 0x0000000002693370 
======= Backtrace: ========= 
/lib/libc.so.6(+0x775b6)[0x7f42719465b6] 
/lib/libc.so.6(cfree+0x73)[0x7f427194ce53] 
./abc[0x405f01] 
/lib/libc.so.6(__libc_start_main+0xfd)[0x7f42718edc4d] 
./abc[0x400ee9] 
======= Memory map: ======== 
00400000-00416000 r-xp 00000000 08:07 392882        
00616000-00617000 r--p 00016000 08:07 392882 

J'ai essayé avec les réponses indiqués ci-dessus, mais je m'y suis comme suit error.What mentionnée ci-dessus peut être la raison?

[EDIT]

Le problème mentionné ci-dessus est maintenant résolu. Comme il y avait un bug dans le code. Maintenant, ce que je ne reçois pas est une amélioration de la mémoire libérée. Quelle peut être la raison de cela?

[EDIT] J'utilise des modules pour imprimer le memory.following est le code

 memory_Print(); 
    #ifdef CHECK 
    memory_PrintLeaks(); 
     #endif 

Ici memory_PrintLeaks() imprime la mémoire demandée et libéré memory.I reçois la même valeur après les modifications. Une remarque supplémentaire ce que je voudrais ajouter est, puis-je appeler le free() n'importe où à partir du programme ou il est nécessaire d'appeler à partir de certains endroits particuliers comme l'endroit où le malloc() a été appelé ou au fin du programme?

+3

Vous avez un bug. Le premier 'malloc' alloue de l'espace pour' pointers', pas 'ints'. L'appel de la fonction devrait être 'malloc (n * sizeof (int *))' – Blastfurnace

+0

oui cela a fonctionné maintenant. Mais pourquoi la fuite de mémoire est la même pour moi après avoir fait cela aussi? Je ne reçois aucune amélioration dans la mémoire libérée. – thetna

+0

Modifiez votre code pour montrer comment vous «libérez» la mémoire. – Blastfurnace

Répondre

5

Avec free. Vous devez d'abord libérer la mémoire pointée par les entrées arr[i], puis enfin libérer la mémoire pointée par arr (qui contient ces entrées). Vous ne pouvez pas le faire dans l'autre sens, car libérer de la mémoire signifie que vous ne pouvez plus utiliser les valeurs qui étaient dans cette mémoire.

Ainsi:

for (i = 0; i < n; ++i) { 
    free(arr[i]); 
} 
free(arr); 
+0

J'ai essayé avec le comme il est mentionné ici, mais j'ai eu une erreur. Je l'ai ajouté en question lui-même. Pouvez-vous s'il vous plaît me dire ce qui s'est mal passé? – thetna

1
for (i=0; i<n; ++i){ 
    free(arr[i]); 
} 

free(arr); 

BTW, vous devez vous assurer que vos allocations ne manquèrent pas, au moins l'un pour arr, ou bien vous finiraient déréférencement des pointeurs NULL.

1

Vous devez traverser arr et libérer arr[i], puis arr libre lorsque vous avez terminé. Vous avez besoin du même nombre d'appels gratuits que les appels malloc.