5

私の何人かの同僚に興味深い点が生じました.何人かの同僚は、何があっても自分のことを常にfree覚えておくべきだと主張していますmalloc. 私はいつもこれが一般的に良い習慣だと思ってきましたが、次のようなプログラムでは必要ないと主張する人もいます:

#include <stdio.h>
#include <stdlib.h>
int main (void) {
    char *mem = malloc (1000);
    if (mem != NULL) {
        // do something with mem
    }
    // memory not freed
    return 0;
}

彼らの主張は、プロセスが終了するとメモリがクリーンアップされるというものでした。

さて、地元の標準的な超オタクとして、彼らは私に説明を求めてきましたが、驚いたことに、常に無料の群衆実際には正しいようです.

C11, に目を向けると、 の末尾に到達することは を呼び出すことと同じ5.1.2.2.3 Program terminationであると単純に述べられています。mainexit

7.22.4.4 The exit function具体的には、クリーンアップされたものをリストします。

  • atexitすべてのハンドラを呼び出します。
  • 未書き込みのバッファリングされたすべてのオープン ストリームがフラッシュされます。
  • 開いているすべてのストリームが閉じられます。
  • によって作成されたすべてのファイルtmpfileが閉じられます。
  • 制御は環境に戻されます。

割り当てられたメモリのクリーンアップについては言及されていません。

ここで を見ると6.2.4 Storage duration of objects、「割り当てられた」がここで興味深いものである 4 つの保存期間が言及されています。さらに、次のように述べています。

割り当てられたストレージについては、7.22.3 で説明されています。

7.22.3 Memory management functionsmallocや などのすべてのお気に入りの動作を指示しますfree。プロセスが終了する前に解放されていないメモリがどうなるかについては、まったく言及されていません。それは単に述べています:

割り当てられたオブジェクトの有効期間は、割り当てから解放まで延長されます。

これは実装が何をするかという問題ではないことに注意してください。これまでに見たほぼすべての実装がプロセス空間内にメモリアリーナを格納し、プロセスが終了すると破棄されることをよく知っています。これは、ISO C 標準で許可されているものです。

この「終了時に解放」動作を義務付ける標準には何も見つからないため、割り当てられたメモリがプロセスの終了を生き延びた実装が実現可能です (mallocたとえば、永続的な共有メモリを使用する を考えてください)。

そこで質問です。(ISO C によると) 割り当てられたメモリが、それを割り当てたプロセスがなくなった後でもリソースを消費し続ける可能性はありますか?

または、これを意味のないものにする標準の何かを見逃したことがありますか?

4

1 に答える 1

7

プログラムの終了後に割り当てられたメモリをクリアすることは、C 標準ではなく、OS の権限に該当します。

私の知る限り、ほとんどの主要な OS は、プログラムが終了すると、割り当てられたすべてのメモリの割り当てを実際に解除します。組み込み OS は例外かもしれませんが、これを裏付ける確固たる資料はまだありません。

編集:同じ問題について議論する別のスレッド -プログラムの終了後に動的に割り当てられたメモリ

于 2013-02-08T02:03:52.600 に答える