如何在C中释放内存?

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(),即使可能有足够的内存可用作免费存储中的总字节数,调用失败,并且您实际上是"内存不足".

  • 当我输入我的答案时,OP更新了他的问题(我猜测是回应了一些评论)......我认为即使没有明确回答他的更新问题,我的答案仍然可能是有益的.他最初的问题没有代码,基本上他正在使用`malloc`和`free`,但仍然以"无法分配区域"错误结束.这听起来像是可能的内存碎片,所以我认为这可能是一个很好的答案. (5认同)
  • 是仅仅是我还是OP正在问一些不同的东西,答案(虽然很好)解释了其他的东西? (2认同)
  • 你会如何修复这种碎片? (2认同)