疑問に思っている点
c言語のfree関数の動作の仕方
該当のソースコード
C
1int main(void) { 2 int *heap; 3 heap = (int *)malloc(256); 4 *heap = 123; 5 printf("%d\n",*heap); 6 free(heap); 7 printf("%d\n",*heap); 8 return 0; 9 }
###実行結果
123
123
###質問内容
なぜfree関数で開放した後でも値が出るのでしょうか。
まだ勉強し始めて間もない初心者なので詳しく教えていただけると助かります。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答8件
0
"たまたま"です。
そもそもfreeした領域を読み出すことに意味はない。
もう"要らない"からfreeしたんでしょ?
ソコの値がどうであれ気にすることじゃない。
投稿2018/03/04 22:59
総合スコア16614
0
解放したと言うことは、「以降のmallocで割り当て可能な領域」として登録されること。それだけでそこの値はいちいち消去されないためです。
投稿2018/03/04 21:45
総合スコア702
0
偶然あなたの使っているCライブラリの実装がそうなっているだけです。
freeは、渡されたアドレスがmalloc/realloc/callocで割り当てられたアドレスである場合その後の割当に使用できるようにします。
が、
mallocは、freeで解放されたアドレスを使いまわすとはなっていません。
よって、怠惰で富豪なfreeは何もしません。
故意か偶然かは知りませんが、解放後にメモリアクセスをしてしまうバグで予想外の事にはなりづらいです。
ちゃんとメモリをクリアして割当てた領域外への書き込みをしていた形跡がないかまで検査する実装もあります。
自分でmalloc/freeっぽいのを実装して使い回しを行い、メモリクリアを行わなかったせいで大問題になった例もあります。
投稿2018/03/04 23:41
総合スコア15147
0
適当に確保する量を増やしてみます。
int main(void) { int *heap; heap = (int *)malloc(256*1024*1024); *heap = 123; printf("%d\n",*heap); free(heap); printf("%d\n",*heap); return 0; }
256MB確保・解放すると私の手元の環境(CentOS7 gcc4.8.5)では
[vagrant@localhost ~]$ ./a.out 123 Segmentation fault
と読み取りに失敗しました。
大きなメモリを確保する際に内部の確保済みメモリを使わずにOSからメモリを受取り
解放時にはそのままOSへ返却する実装は多いと予測できます
投稿2018/03/05 16:01
総合スコア15147
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/05 16:15
2018/03/06 01:46
2018/03/06 01:49 編集
2018/03/06 01:49 編集
2018/03/21 23:04
0
ベストアンサー
メモリの確保、開放、といってもそのエリアをメモリ管理機構(?)に登録するか登録解除するか、だけの話でしかないです。
登録解除するときに、わざわざそのエリアをクリアするわけでもないので、解除直後はデータはそのまま残ったままです。
が、そのデータはいつ破壊されても文句は言えないってことですねー
投稿2018/03/04 21:49
総合スコア87774
0
解放されたからといっても、古い値が残っていることはあり得ます。また、C言語の仕様上「未定義の状態」となったからといってエラー停止するとも限りません。「バグの結果、意図通りの動作をする」ということも実際はかなりあります(大抵、後になってから大騒ぎする)
自分の場合**「free後は直ちに当該ポインタ変数にNULLを代入する」**と心がけています。
投稿2018/03/05 12:30
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/05 14:13
2018/03/05 14:22
2018/03/05 20:10 編集
2018/03/21 23:04
0
有名な例え話ですが。
1,あなたはホテルで部屋を借りました。 (malloc
)
2,あなたはベッドサイドテーブルの一番上の引き出しに本を置き、眠ります。
3,あなたは翌朝チェックアウト(free
)しますが、部屋の鍵(ポインタ
)を返却するのを忘れてしまいます。
4,一週間後、部屋の鍵があったので、ホテルの部屋に忘れ物(本)を取りに行きました。
5,ホテルの部屋を鍵で開けるとまだ清掃されていなのか、忘れ物が残ってました。
要点は1点
チェックアウト(free
)したあとに部屋の鍵(ポインタ
)を使ってはいけません。
投稿2018/03/05 10:44
編集2018/03/05 10:58総合スコア5846
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/05 14:04
2018/03/05 22:55
2018/03/07 04:16
2018/03/21 23:05