我有以下代码:
int **ptr = (int **)malloc(sizeof(int*)*N);
for(int i=0;i<N;i++)
ptr[i]=(int*)malloc(sizeof(int)*N));
我该如何使用free
来释放指针ptr
?我应该循环遍历ptr
并释放ptr[i]
还是只需要:free(ptr)
那么ptr
指向的内存将被释放吗?
我有以下代码:
int **ptr = (int **)malloc(sizeof(int*)*N);
for(int i=0;i<N;i++)
ptr[i]=(int*)malloc(sizeof(int)*N));
我该如何使用free
来释放指针ptr
?我应该循环遍历ptr
并释放ptr[i]
还是只需要:free(ptr)
那么ptr
指向的内存将被释放吗?
与分配相反:
for(int i = 0; i < N; i++)
free(ptr[i]);
free(ptr);
int **ptr = (int **)malloc(sizeof(int*)*N);
- Donotaloptr[i]
,释放你遍历到的每个int*
,就像你最初建议的那样。例如:for (int i = 0; i < N; i++)
{
int* currentIntPtr = ptr[i];
free(currentIntPtr);
}
free(ptr[i])
循环处理呢? - Russbear是的,您必须循环遍历 ptr
并释放每个 ptr[i]
。为了避免内存泄漏,一般规则是:对于每个 malloc()
,必须有一个相应的 free()
。
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运行时库的一部分。这将给C带来新鲜空气。这将使C在2019年再次成为合理和有竞争力的语言。但是因为它不是,它会增加1 MB到您的应用程序中(无论是在DLL大小还是可执行文件大小上)。此外,Windows发行版由虐待狂维护。
for(int i=0;i<N;i++) free(ptr[i]);
free(ptr);
你没有检查分配内存的malloc失败。你应该总是检查。
void freeMatrix(int **matrix ,int row)
{
for(int i=0;i<row;i++)
{
free(matrix[i]);
}
free(matrix);
}