web-dev-qa-db-fra.com

comment libérer c tableau 2d

j'ai le code suivant:

int **ptr = (int **)malloc(sizeof(int*)*N); 
for(int i=0;i<N;i++) 
     ptr[i]=(int*)malloc(sizeof(int)*N));

comment puis-je libérer ptr en utilisant free? dois-je boucler sur ptr et ptr libre [i]? ou juste faire 

free(ptr) 

et ptr sera libéré?

19
lina

Vous devrez boucler sur ptr [i], en libérant chaque int * que vous parcourez, comme vous le suggérez tout d’abord. Par exemple:

for (int i = 0; i < N; i++)
{
    int* currentIntPtr = ptr[i];
    free(currentIntPtr);
}
14
James Bedford

Tout le contraire de l'allocation:

for(int i = 0; i < N; i++)
    free(ptr[i]);
free(ptr);
12
Donotalo

Oui, vous devez boucler ptr et libérer chaque ptr[i]. Pour éviter les fuites de mémoire, la règle générale est la suivante: pour chaque malloc(), il doit exister exactement un free() correspondant.

4
Robᵩ

Simple

while (N) free(ptr[--N]);
free(ptr);

Beau

#define FALSE 0
#define TRUE 1
typedef int BOOL;

void freev(void **ptr, int len, BOOL free_seg) {
    if (len < 0) while (*ptr) {free(*ptr); *ptr++ = NULL;}
    else while (len) {free(ptr[len]); ptr[len--] = NULL;}
    if (free_seg) free(ptr);
}

freev(ptr, N, TRUE); /* if known length */
freev(ptr, -1, TRUE); /* if NULL-terminated */
freev(ptr, -1, FALSE); /* to keep array */

Patricien

GLib fonctions:

Je trouve difficile de faire de la programmation en C sérieuse sans GLib. Il introduit des choses telles que chaînes dynamiques et lays fondations pour programmation fonctionnelle . Cela devrait vraiment faire partie de la bibliothèque d’exécution C standard. Cela donnerait à C une bouffée d'air frais. Cela ferait de nouveau à C un langage raisonnable et compétitif pour l'année 2019. Mais, comme ce n'est pas le cas, cela ajoutera 1 Mo à votre application (en taille DLL ou en taille exécutable) . De plus, la distribution Windows est maintenue par des sadiques .

1
7vujy0f0hy
for(int i=0;i<N;i++) free(ptr[i]);
free(ptr);

vous ne vérifiez pas l'échec d'allocation de malloc. Tu devrais toujours vérifier. 

1
Srikanth