我正在编写有很多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
功能?
答案 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()
的调用失败了,即使可能有足够的内存作为免费存储中的总字节数,你也会有效地“内存不足”。