我怎么能控制free()函数工作正常?

时间:2014-08-27 08:20:56

标签: c multidimensional-array malloc free

我对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编程的新手!

4 个答案:

答案 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