C语言 动态分配 - 内存管理



我知道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()调用后不能信任存储单元,这就足够了。

最新更新