C语言 这是内存碎片吗?(视觉工作室和明文)



我有一个内存碎片问题,可以用这个小例子来概括:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
   void *p[8000];int i,j;
   p[0]=malloc(0x7F000);
    if (p[0]==NULL) 
        printf("Alloc after failed!n");
    else 
        free(p[0]); 
   for (i=0;i<8000; i++) {
       p[i]=malloc(0x40000);
       if (p[i]==NULL){
          printf("alloc failed for i=%dn",i);
          break;
       }
    }
    for(j=0;j<i;j++) {
        free(p[j]);
    }
    /*Alloc 1 will fail, Alloc 2 *might* fail, AlloC3 succeeds*/
    p[0]=malloc(0x7F000);
    if (p[0]==NULL) 
        printf("Alloc1 after failed!n");
    else {printf("alloc1 successn");free(p[0]);}
    p[0]=malloc(0x40000);
    if (p[0]==NULL) 
        printf("Alloc2 after failed!n");
    else {printf("alloc2 successn");free(p[0]);}
    p[0]=malloc(0x10000);
    if (p[0]==NULL) 
    printf("Alloc3 after failed!n");
    else {printf("alloc3 successn");free(p[0]);}
   printf("end");
}

程序打印(使用 MSVC 编译(使用调试和发布分配器)和 Win7 上的 MinGW 编译):

alloc failed for i=7896
Alloc1 after failed!
alloc2 success
alloc3 success
end

无论如何,我可以避免这种情况吗?在我的实际应用程序中,我无法避免这种情况,我的程序达到了 2GB 内存限制......但我希望能够通过释放一些东西来继续。

为什么在这个小例子中首先会发生碎片化?当我开始做"free-s"时,为什么内存块没有压缩,因为它们应该是相邻的。

谢谢!

内存碎片是分配不同大小的内存的结果,每个大小的内存都有不同的生命周期。这就是在可用内存中创建漏洞的原因,这些漏洞总共足以满足单个分配请求,但每个孔本身都太小。

程序中的情况似乎揭示了一个错误,即堆管理代码没有合并相邻的释放内存。我确实希望您的分配序列会创建一个 64 KB 的孔。

为了避免这个特殊问题,我会在完成第一个分配后简单地保留它,可以说将其存储在我自己的"免费列表"中。然后下次我需要它时,我会从"免费列表"中取出它,而不是打电话给malloc().

相关内容

  • 没有找到相关文章

最新更新