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バイトかどうか

解放後の表示 ():


あなたの整数は次のとおりです。
0
85
78

理解できない!整数を要求しても、常に 33 ページを割り当てます。

4

1 に答える 1

4

コンピュータは、メモリセルに格納されているものを忘れることによってメモリを解放します。free() と入力すると、ヒープ管理に対して、そのアドレスには何も格納されておらず、メモリ セルはもう予約されていないことを伝えるだけです。そのため、メモリセルを「消去」するようなことはなく、アクティブにゼロを書き込むコードは実行されません。

特定のケースでは、free() を呼び出し、3xsizeof(int) バイトがプログラムの残りの部分で自由に使用できることを伝えます。プログラムの他の部分で値 0 をどこかに格納する必要がありましたが、たまたま以前に予約したセルに格納されていました。

一般に、free() に渡されたポインターの内容を出力することは未定義の動作です。何でも起れる。特定のコンパイラの特定のプログラムで、未定義の動作が特定の方法で動作する理由をくどくど考えることは、無意味な知識です。free() 呼び出しの後でメモリ セルを信頼できないことを受け入れるだけで十分です。

于 2012-05-07T11:45:48.367 に答える