and*_*rey 32 c malloc memory-management
我正在编写具有大量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);
...............
Run Code Online (Sandbox Code Playgroud)
我该如何使用该free功能?
Alo*_*ave 44
您必须按照free()与使用分配方式完全相反的顺序分配内存malloc().
请注意,只有在完成对已分配指针的使用后才能释放内存.
1D数组的内存分配:
buffer = malloc(num_items*sizeof(double));
Run Code Online (Sandbox Code Playgroud)
1D数组的内存释放:
free(buffer);
Run Code Online (Sandbox Code Playgroud)
2D数组的内存分配:
double **cross_norm=(double**)malloc(150 * sizeof(double *));
for(i=0; i<150;i++)
{
cross_norm[i]=(double*)malloc(num_items*sizeof(double));
}
Run Code Online (Sandbox Code Playgroud)
2D数组的内存释放:
for(i=0; i<150;i++)
{
free(cross_norm[i]);
}
free(cross_norm);
Run Code Online (Sandbox Code Playgroud)
Jas*_*son 28
你实际上不能手动"释放"C中的内存,因为内存从进程释放回OS ...当你调用时malloc(),底层的libc-runtime将从OS请求一个内存区域.在Linux上,这可以通过相对"重"的调用来完成mmap().一旦这个内存区域映射到您的程序,就会有一个名为"free store"的链表设置来管理这个分配的内存区域.当你打电话时malloc(),它会快速查看免费商店,以获得所需大小的免费内存块.然后,它调整链接列表以反映从最初分配的内存池中取出的一块内存.当您调用free()内存块时,将其作为链接列表节点放回到免费存储区中,该节点指示其可用的内存块.
如果您请求的内存多于免费存储中的内存,则libc-runtime将再次从操作系统请求更多内存,直至操作系统为运行进程分配内存的能力限制.当你释放内存时,它不会返回到操作系统......它通常会被循环回到免费商店,在那里可以通过另一次调用再次使用它malloc().因此,如果你做了很多电话来malloc()与free()具有不同存储容量的要求,它可以在理论上,造成所谓的"记忆碎片",那里是在空闲存储分配您请求的内存块足够的空间条件,但没有足够的连续空间来容纳你要求的块的大小.因此malloc(),即使可能有足够的内存可用作免费存储中的总字节数,调用失败,并且您实际上是"内存不足".