2012-01-30 93 views
23

我正在写代码,它有很多2维数组。我得到了“错误:无法分配区域”,我认为它是因为分配的内存太多。我使用“malloc”和“free”函数,但我不确定我是否正确使用它们。也许你知道我在哪里可以看到有关C语言内存管理的好例子?如何在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功能?

+6

也许这将是更有建设性的向我们展示你尝试过什么? – cnicutar 2012-01-30 18:59:45

+2

显示您的代码。 – Pheonix 2012-01-30 19:00:06

+0

你应该提供你做什么的例子。否则你的问题太笼统了,无法回答:阅读规格。 – akira 2012-01-30 19:00:41

回答

32

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

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

为一维数组的存储器分配:对于一维数组

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

内存释放:

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

二维数组内存释放:

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

    free(cross_norm); 
24

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

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

+2

这只是我还是OP在问一些不同的东西,答案(虽然很好)解释了别的东西? – 2012-01-30 19:31:20

+3

OP更新了他的问题,因为我正在键入我的答案(我在回应一些评论时猜测)......我认为即使它没有明确回答他更新的问题,我的答案也可能具有启发性。他原来的问题没有代码,基本上他使用'malloc'和'free',但仍然以“无法分配区域”错误结束。它听起来像是可能的内存碎片,所以我认为这可能是一个很好的答案。 – Jason 2012-01-30 19:40:08

+0

啊我明白了。好的。这是一个很好的解释,虽然改变后的问题使它感觉不合适。反正你有我的努力+1。 – 2012-01-30 19:43:38