我对C的free()函数有一个小问题。
我在程序中使用以下代码分配多维数组:
char **newMatrix( int N ){
int i,j;
char **a = malloc(sizeof *a * N);
if (a)
{
for (i = 0; i < N; i++)
{
a[i] = malloc(sizeof *a[i] * N);
}
}
在程序结束时,数组中充满了字符。 所以我这样做是为了释放内存。
void freeArray(char **a, int m){
int i;
for (i = 0; i < m; ++i) {
free(a[i]);
}
free(a);
}
我的问题是,如何才能真正检查free()函数是否运行良好,并释放所有内存? 我问你,因为我试图在freeArray之后打印矩阵,结果是值仍然存储在a [i] [j]列和行中。
很抱歉,如果这是一个愚蠢的问题,我是C编程的新手!
答案 0 :(得分:5)
free
并不意味着它实际上会删除内存!它将通知操作系统我不再需要这个内存,将其用于其他一些过程!
在调用a
之后,您当然可以继续使用数组free(a)
,但没有什么可以阻止您。但是,结果将完全未定义且不可预测。它只适用于运气。这是一个常见的编程错误,称为&#34; use after free&#34;它可以在许多程序中使用几年,而不会出现问题&#34; - 直到它引起问题。
有些工具非常善于发现此类错误,例如Valgrind。
答案 1 :(得分:1)
免费不会为您清除记忆。它只是标记它可供操作系统重新分配到其他地方。人们倾向于在释放后为指针分配NULL以防止意外重用。如果要确定代码正在执行的操作,可以在释放之前将已分配的空间memset到已知值。说实话,只需打印出您分配的数据量,并确保从同一指针中释放相同大小的数据。
答案 2 :(得分:0)
free()只会通过传递给它的指针删除对内存的引用。
一旦指针传递给free()并且free()返回成功(总是......),就不应该使用指针。
为了避免这种非法引用的用法,指针变量在传递给free()后应始终指定为NULL。
答案 3 :(得分:0)
如果我理解正确,你想检查一下:
不可能直接从语言中进行 - 但是有些工具可以提供帮助。例如Valgrind可以检查这两件事(以及更多)。如果您使用的是UMHD之类的Windows工具可能会有所帮助,但我没有找到任何免费软件替代品(尽管另见"Is there a good Valgrind substitute for Windows?" question)