私の何人かの同僚に興味深い点が生じました.何人かの同僚は、何があっても自分のことを常に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
であると単純に述べられています。main
exit
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 functions
malloc
や などのすべてのお気に入りの動作を指示しますfree
。プロセスが終了する前に解放されていないメモリがどうなるかについては、まったく言及されていません。それは単に述べています:
割り当てられたオブジェクトの有効期間は、割り当てから解放まで延長されます。
これは実装が何をするかという問題ではないことに注意してください。これまでに見たほぼすべての実装がプロセス空間内にメモリアリーナを格納し、プロセスが終了すると破棄されることをよく知っています。これは、ISO C 標準で許可されているものです。
この「終了時に解放」動作を義務付ける標準には何も見つからないため、割り当てられたメモリがプロセスの終了を生き延びた実装が実現可能です (malloc
たとえば、永続的な共有メモリを使用する を考えてください)。
そこで質問です。(ISO C によると) 割り当てられたメモリが、それを割り当てたプロセスがなくなった後でもリソースを消費し続ける可能性はありますか?
または、これを意味のないものにする標準の何かを見逃したことがありますか?