как освободить c 2d массив - PullRequest
       1

как освободить c 2d массив

20 голосов
/ 14 апреля 2011

У меня есть следующий код:

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

как я могу освободить ptr используя free?я должен зацикливаться на ptr и свободный ptr [i]?или просто сделать

free(ptr) 

и ptr будет освобожден?

Ответы [ 5 ]

14 голосов
/ 14 апреля 2011

Вам придется перебрать ptr [i], освобождая каждый int *, который вы проходите, как вы сначала предложили. Например:

for (int i = 0; i < N; i++)
{
    int* currentIntPtr = ptr[i];
    free(currentIntPtr);
}
13 голосов
/ 14 апреля 2011

Как раз наоборот:

for(int i = 0; i < N; i++)
    free(ptr[i]);
free(ptr);
4 голосов
/ 14 апреля 2011

Да, вы должны перебрать ptr и освободить каждого ptr[i]Чтобы избежать утечек памяти, общее правило таково: для каждого malloc() должен быть ровно один соответствующий free().

1 голос
/ 15 января 2019

Простой

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

красивый

#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 */

Патриция

GLib функции:

  • g_ptr_array_free() для освобождения массивов указателей,
  • g_strfreev() для освобождения массивов строк.

Мне трудно заниматься серьезным программированием на C без GLib. Он вводит такие вещи, как динамические строки и закладывает основы для функционального программирования . Это действительно должно быть частью стандартной библиотеки времени выполнения C. Это дало бы С глоток свежего воздуха. Это сделало бы C разумным и конкурентоспособным языком снова для 2019 года. Но поскольку это не так, это добавит 1 МБ к вашему приложению (либо в размере DLL, либо в размере исполняемого файла). Также дистрибутив Windows поддерживается садистами .

1 голос
/ 14 апреля 2011
for(int i=0;i<N;i++) free(ptr[i]);
free(ptr);

вы не проверяете, чтобы malloc не удалось выделить.Вы должны всегда проверять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...