如何在C中释放内存?

时间:2012-01-30 18:58:48

标签: c memory-management malloc

我正在编写有很多1和1的代码。二维数组。我得到了“错误:无法分配区域”,我认为是因为分配了太多内存。我使用“malloc”和“free”函数,但我不确定我是否正在使用它们。也许你知道在哪里可以看到C中内存管理的好例子吗?

所以..我只是想让一个算法工作,现在这个代码只是函数后的函数..

//memory allocation for 1D arrays
buffer = malloc(num_items*sizeof(double));

//memory allocation for 2D arrays
double **cross_norm=(double**)malloc(150 * sizeof(double *));
for(i=0; i<150;i++)
    {
        cross_norm[i]=(double*)malloc(num_items*sizeof(double));
    }

    //code
Window(N, window_buffer);
STFTforBMP(buffer,N,f, window_buffer);
getMagnitude(buffer,f, N, magnitude);
calculateEnergy(flux,magnitude, f);
calculateExpectedEnergy(expected_flux, candidate_beat_period, downbeat_location, f);
calculateCrossCorrelation(cross, flux, expected_values, f);
findLargestCrossCorrelation(&cross_max, cross, f);
normalizeCrossCorrelation(cross_norm, &cross_max, cross, f);
    ...............

我应该如何使用free功能?

2 个答案:

答案 0 :(得分:41)

您必须free()分配的内存,其顺序与使用malloc()的方式完全相反。

请注意,只有在完成对已分配指针的使用后才能释放内存。

1D阵列的内存分配:

    buffer = malloc(num_items*sizeof(double));

1D阵列的内存释放:

    free(buffer);

2D阵列的内存分配:

    double **cross_norm=(double**)malloc(150 * sizeof(double *));
    for(i=0; i<150;i++)
    {
        cross_norm[i]=(double*)malloc(num_items*sizeof(double));
    }

2D阵列的内存释放:

    for(i=0; i<150;i++)
    {
        free(cross_norm[i]);
    }

    free(cross_norm);

答案 1 :(得分:28)

实际上你无法手动“释放”C中的内存,因为内存从进程释放回操作系统......当你调用malloc()时,底层的libc-runtime将请求从OS一个内存区域。在Linux上,这可以通过像mmap()这样相对“重”的调用来完成。一旦这个内存区域映射到您的程序,就会有一个名为“free store”的链表设置来管理这个分配的内存区域。当你调用malloc()时,它会快速查看免费存储区,以获得所需大小的空闲内存块。然后,它调整链接列表以反映从最初分配的内存池中取出的一块内存。当您调用free()时,内存块将作为链接列表节点放回到免费存储区中,该节点指示其可用的内存块。

如果您请求的内存多于免费存储中的内存,则libc-runtime将再次从操作系统请求更多内存,直至操作系统为运行进程分配内存的能力限制。当您释放内存时,它不会返回到操作系统...它通常会被循环回到免费商店,可以通过另一次调用malloc()再次使用它。因此,如果你使用不同的内存大小请求对malloc()free()进行大量调用,理论上它可能会导致一种称为“内存碎片”的情况,其中有足够的空间。 -store分配您请求的内存块,但没有足够的连续空间来表示您请求的块的大小。因此,对malloc()的调用失败了,即使可能有足够的内存作为免费存储中的总字节数,你也会有效地“内存不足”。