如何在C中释放内存?

我正在编写具有大量1维和2维数组的代码。 我得到了“错误:无法分配区域”,我认为这是因为分配了太多内存。 我使用“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); ............... 

我该如何使用freefunction?

你必须以与使用malloc()分配内存完全相反的顺序free()分配的内存。

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

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); 

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

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