我知道malloc()是一个过度允许和自由()不会释放整个内存。我测试了一个检查所有这些的代码:
extern char _end;
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char * res;
int tas,rupt,esp;
printf("n Before any memory reservationn --------------------------n");
tas=sbrk(0);
printf("End position of the pile : %pn",tas);
rupt=&_end;
printf("Breaking point : %pn",rupt);
esp=tas-rupt;
printf("Space between the end of the heap and breaking point : %d bytes n",esp);
printf("Pages allocated for malloc %fn",(tas-rupt-esp)/4096.0);
printf("whether %d bytesn",tas-rupt-esp);
int nbEntier = 0, i = 0;
int* tabEntier ; // This pointer is used as a table after the call of malloc
// Asked the number of integers to the user
printf("How integer do you want to store? ");
scanf("%d", &nbEntier);
if (nbEntier > 0)
{
tabEntier = malloc(nbEntier * sizeof(int));
if (tabEntier== 0)
{
exit(0); //
}
//We ask the integer
for (i = 0 ; i < nbEntier ; i++)
{
printf("Integer n° %d ? ", i + 1);
scanf("%d", &tabEntier[i]);
}
// We display the integer one to one
printf("nnYour integers are :n");
for (i = 0 ; i < nbEntier ; i++)
{
printf("%d n", tabEntier[i]);
}
tas=sbrk(0);
printf("End position of the pile : %pn",tas);
rupt=&_end;
printf("Breaking point : %pn",rupt);
printf("Space between the end of the heap and breaking point : %d bytes n",tas-rupt);
printf("Pages allocated for malloc %fn",(tas-rupt-esp)/4096.0);
printf("whether %d bytesn",tas-rupt-esp);
free(tabEntier);
printf("nDisplay after free ():n");
printf("nnYour integers are :n");
for (i = 0 ; i < nbEntier ; i++)
{
printf("%d n", tabEntier[i]);
}
}
return 0;
}
我的结果:
在任何内存预留之前--------------------------桩的末端位置:0x9886000断裂点 : 0x8049c2c堆末尾和断点之间的间距:25412564字节分配给 malloc 的页面数 0.000000是否为 0 字节您要存储多大的整数?3整数 n° 1 ?45整数 n° 2 ?85整数 n° 3 ?78您的整数是:458578桩的结束位置:0x98a7000断裂点 : 0x8049c2c堆末尾和断点之间的间距:25547732字节为 malloc 分配的页面数 33.000000是否135168字节释放后显示 ():您的整数是:08578
我不明白!即使我问一个整数,它也会一直分配 33 页,以及为什么在免费 () 之后它会释放整个第一个而不是其余部分......
计算机通过忘记存储在存储单元中的内容来释放内存。当您键入 free() 时,您只需告诉堆管理在该地址上存储任何感兴趣的内容,并且不再保留内存单元。因此,没有"擦除"存储单元这样的事情,不会执行主动向其写入零的代码。
在你的特定情况下,你调用free()并告诉它3xsizeof(int)字节可以自由地被程序的其余部分使用。程序的其他部分需要将值 0 存储在某处,而它恰好在您之前保留的单元格中。
通常,打印已传递给 free() 的指针的内容是未定义的行为。任何事情都可能发生。纠缠于为什么一个未定义的行为以某种方式,在某个编译器的某个程序中起作用,是毫无意义的知识。只需接受在free()调用后不能信任存储单元,这就足够了。