4

で割り当てたメモリを解放しようとしていますが、Eclipse のデバッガによるとmallocfreeコマンドが適切に機能していないようです。これはどのように可能ですか?

以下は、おそらく解放された後のデバッガーのスクリーンショットですが、seCurrent->student->year明らかにそうではありません。yearを使用して割り当てられmallocました。

代替テキスト http://img693.imageshack.us/img693/7840/codeo.png

4

4 に答える 4

13

free() は通常、プログラム内の値を変更しません。C ランタイム ヒープを調整するだけです。これは、解放されたばかりのメモリ内の値が保持されることを意味します。ただし、コードからそれらにアクセスしようとすると、未定義の動作が発生します。

于 2010-02-21T12:50:15.247 に答える
7

それが解放されていないと思う理由は何ですか?メモリを解放するということは、その後プログラムからメモリにアクセスすることは未定義の動作であり、次に malloc を呼び出すときにメモリを再利用できることを意味します。解放したメモリに格納されたデータを上書きしたり、デバッガが未割り当てのメモリを読み取ったりすることを約束するものではありません。

于 2010-02-21T12:51:14.730 に答える
5

Free は、割り当てられた領域をヒープに戻して後続の malloc で再利用しますが、以前にそのメモリを参照していたポインタの値は変更しません。あなたの場合、他の malloc はまだ実行されていないため、解放されたばかりのメモリは、free の呼び出しの直前と同じです。ポインターに関連付けられたデータがなくなったことをコードが認識できるようにするために、ポインターにnull関連付けられたメモリを解放した後で、ポインターを に設定することができます。

于 2010-02-21T12:57:09.283 に答える
1

メモリをmalloc()使用すると、メモリ内の空きスペースを検索し、現在使用されていることを追跡するだけです。初期化などはしません。

を呼び出すとfree()、使用中のメモリ ブロックのリストからこのメモリ ブロックがクリアされるだけです。繰り返しますが、内容は変更されません。

于 2010-02-21T12:58:34.233 に答える