2012-05-07 35 views
0

私は(それは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 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; 
} 

マイ結果:

 
Before any memory reservation 
-------------------------- 
End position of the pile : 0x9886000 
Breaking point : 0x8049c2c 
Space between the end of the heap and breaking point : 25412564 bytes 
Pages allocated for malloc 0.000000 
whether 0 bytes 
How integer do you want to store? 3 
Integer n° 1 ? 45 
Integer n° 2 ? 85 
Integer n° 3 ? 78 


Your integers are : 
45 
85 
78 
End position of the pile : 0x98a7000 
Breaking point : 0x8049c2c 
Space between the end of the heap and breaking point : 25547732 bytes 
Pages allocated for malloc 33.000000 
whether 135168 bytes 

Display after free(): 


Your integers are : 
0 
85 
78 

私は理解していません!これは、33ページに、私は整数を尋ねると、場合でも、すべての時間を割り当てても、なぜ後の自由()それは...全体の最初ではなく、残りを解放

+0

33はどこから来るのでしょうか?私はあなたの結果にそれを見ません... – RedX

+0

申し訳ありませんが、私は間違ったコードです。私はポストを更新強く関連REDX –

答えて

4

コンピュータがメモリセルに記憶されているもの忘れによるメモリを解放します。 free()とタイプすると、ヒープ管理にそのアドレスに何も格納されておらず、メモリセルがそれ以上予約されていないことを簡単に伝えることができます。したがって、メモリセルを「消去」するようなことはありません。それに積極的にゼロを書き込むコードは実行されません。あなたの特定のケースで

は、あなたが自由に()を呼び出し、3xsizeof(int型)バイトはプログラムの残りの部分で使用するために自由であることを、それを伝えます。プログラムの他の部分は、値0をどこかに格納する必要がありました。そして、それはちょうどあなたが以前に予約していたセルに入ったばかりです。

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

+1

は、[この壮大な解答](http://stackoverflow.com/a/6445794/1025391)もあるありがとう。 – moooeeeep

+0

最初の文は間違っています。そこに格納されているものは忘れません。だから、85と78が再びポップしているのです。 –

+0

@Agent_L「コンピュータ」とはどういう意味ですか?あなたのプログラムとあなたのCPUは確かにそれについてすべてを忘れてしまった、残りのデータへの言及はない。 RAMセルは忘れていない。古くからの古くて厄介なRAMがあったのであれば、コンピュータが自由にセルの電圧リフレッシュをスキップして、それを読もうとするとランダムなジャンクになると思います。 – Lundin

関連する問題