Ответ 1
Вам нужно будет перебрать ptr [i], освободив каждый int *, который вы пройдете, как вы сначала предположите. Например:
for (int i = 0; i < N; i++)
{
int* currentIntPtr = ptr[i];
free(currentIntPtr);
}
У меня есть следующий код:
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 будут освобождены?
Вам нужно будет перебрать ptr [i], освободив каждый int *, который вы пройдете, как вы сначала предположите. Например:
for (int i = 0; i < N; i++)
{
int* currentIntPtr = ptr[i];
free(currentIntPtr);
}
Просто противоположное распределение:
for(int i = 0; i < N; i++)
free(ptr[i]);
free(ptr);
Да, вы должны перебрать ptr
и освободить каждый ptr[i]
. Чтобы избежать утечек памяти, общее правило таково: для каждого malloc()
должно быть ровно одно соответствующее free()
.
for(int i=0;i<N;i++) free(ptr[i]);
free(ptr);
вы не проверяете выделение malloc. Вы всегда должны проверять.
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()
для освобождения массивов строк.Мне трудно заниматься серьезным программированием на С без GLib. Он вводит такие вещи, как динамические строки и закладывает основы для функционального программирования. Это действительно должно быть частью стандартной библиотеки времени выполнения C. Это дало бы С глоток свежего воздуха. Это сделало бы C разумным и конкурентоспособным языком снова на 2019 год. Но поскольку это не так, оно добавит 1 МБ к вашему приложению (либо в размере DLL, либо в размере исполняемого файла). Также дистрибутив Windows поддерживается садистами.