gpt4 book ai didi

c - 这是内存碎片吗? ( Visual Studio 和 mingw)

转载 作者:行者123 更新时间:2023-11-30 17:39:09 25 4
gpt4 key购买 nike

我有一个内存碎片问题,可以在这个小例子中总结:

#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=%d\n",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 success\n");free(p[0]);}

p[0]=malloc(0x40000);
if (p[0]==NULL)
printf("Alloc2 after failed!\n");
else {printf("alloc2 success\n");free(p[0]);}

p[0]=malloc(0x10000);
if (p[0]==NULL)
printf("Alloc3 after failed!\n");
else {printf("alloc3 success\n");free(p[0]);}
printf("end");
}

程序打印(在 Win7 上使用 MSVC(均带有调试和释放分配器)和 MinGW 编译):

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

有什么办法可以避免这种情况吗?在我的真实应用程序中,我无法避免这种情况,我的程序达到了 2GB 内存限制...但我希望能够通过释放某些内容来继续。

为什么在这个小例子中会出现碎片?当我开始执行“free-s”时,为什么内存块没有被压缩,因为它们应该是相邻的。

谢谢!

最佳答案

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

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

为了避免这个特殊问题,我会在完成第一个分配后保留它,可以这么说,将其存储在我自己的“空闲列表”中。然后下次我需要它时,我从“空闲列表”中取出它,而不是调用 malloc()

关于c - 这是内存碎片吗? ( Visual Studio 和 mingw),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21937382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com