0

我知道 malloc() 是一个过度允许和 free() 不会释放整个内存。我测试了一个检查所有这些的代码:

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 reservation\n --------------------------\n");
tas=sbrk(0);
printf("End position of the pile : %p\n",tas);
rupt=&_end;
printf("Breaking point : %p\n",rupt);
esp=tas-rupt;
printf("Space between the end of the heap and breaking point : %d bytes \n",esp);
printf("Pages allocated for malloc %f\n",(tas-rupt-esp)/4096.0);
printf("whether %d bytes\n",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("\n\nYour integers are :\n");
    for (i = 0 ; i < nbEntier  ; i++)
    {
        printf("%d \n", tabEntier[i]);
    }
tas=sbrk(0);
printf("End position of the pile : %p\n",tas);
rupt=&_end;
printf("Breaking point : %p\n",rupt);
printf("Space between the end of the heap and breaking point : %d bytes \n",tas-rupt);
printf("Pages allocated for malloc %f\n",(tas-rupt-esp)/4096.0);
printf("whether %d bytes\n",tas-rupt-esp);

    free(tabEntier);


    printf("\nDisplay after free ():\n");


     printf("\n\nYour 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


你的整数是:
45
85
78
桩的结束位置:0x98a7000
断点:0x8049c2c
堆尾和断点之间的空间:25547732 字节
为 malloc 33.000000 分配的页面
是否 135168 字节

free() 后显示:


你的整数是:
0
85
78

我不明白!即使我问一个整数,它也会一直分配 33 页,以及为什么在 free () 之后它释放整个第一个而不是其余的..

4

1 回答 1

4

计算机通过忘记存储在存储单元中的内容来释放内存。当您键入 free() 时,您只需告诉堆管理器该地址没有存储任何感兴趣的内容,并且不再保留内存单元。因此,没有“擦除”存储单元之类的事情,不会执行主动向其写入零的代码。

在您的特定情况下,您调用 free() 并告诉它 3xsizeof(int) 字节可供程序的其余部分免费使用。程序的其他部分需要将值 0 存储在某处,而它恰好位于您之前保留的单元格中。

通常,打印已传递给 free() 的指针的内容是未定义的行为。任何事情都有可能发生。纠缠于为什么未定义的行为以某种方式在某个编译器的某个程序中以某种方式起作用,是毫无意义的知识。只需接受在 free() 调用后无法信任内存单元,这就足够了。

于 2012-05-07T11:45:48.367 回答