私はプログラムを持っていますが、キーボードから間違ったデータを入力すると、終了しexit(1)
ます。
私は Valgrind でテストしていましたが、これが発生してもエラーは発生しませんが、到達可能な x バイトがまだあることがわかります。
だから私の質問: それは、メモリを解放するのはプログラマ次第ですか、exit()
それとも OS がそれを処理するのでしょうか?
これは良い考えですが (Windows のかなり古いバージョンでは不可欠でした)、プログラムexit()
が最新のオペレーティング システムで実行されると、そのアドレス空間全体が再利用されます。
最終的には、OS が処理します (最近のすべての OS では、古いバージョンの Windows ではそうではありませんでした)。プログラムで使用されるすべてのリソース (メモリ、開いているファイル記述子など) は、プログラムの終了時に OS によって再利用されます (プロセスの終了後も存続するように設計された一部のリソース、主にある種の共有メモリ/ミューテックスを除く)。
ただし、valgrind
メモリ リークを追跡するためにここにあり、必要に応じて手動で解放できるように、使用可能なすべてのメモリ領域を報告します。
ユーザー空間について話していると仮定すると、exit() で割り当てられたメモリをそのままにしておくことはエラーではないと想定するのが通常は安全だと思います。ただし、通常の実行中に終了に達し、終了時に割り当てを解除しないプログラムは、設計が悪いと考えています。
exit() する前に記憶するのは悪い考えです。free
正当な理由なく時間を浪費し、マルチスレッド プログラムでは、他のスレッドが最初に結合されず、割り当てられたメモリの一部にアクセスすると、実際にバグが発生する可能性があります。
「まだ到達可能」はリークではありません。検討:
#include <stdlib.h>
void *a_global;
int main() {
void *a_local = malloc(10);
a_global = malloc(20);
}
gcc -g t.c && valgrind ./a.out
==12228== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==12228== Using Valgrind-3.7.0.SVN and LibVEX; rerun with -h for copyright info
==12228== Command: ./a.out
==12228==
==12228==
==12228== HEAP SUMMARY:
==12228== in use at exit: 30 bytes in 2 blocks
==12228== total heap usage: 2 allocs, 0 frees, 30 bytes allocated
==12228==
==12228== LEAK SUMMARY:
==12228== definitely lost: 10 bytes in 1 blocks
==12228== indirectly lost: 0 bytes in 0 blocks
==12228== possibly lost: 0 bytes in 0 blocks
==12228== still reachable: 20 bytes in 1 blocks
==12228== suppressed: 0 bytes in 0 blocks
ここでは、exit に到達するまでにa_local
、範囲外になっています。そのメモリを解放する方法はありません。それは永遠に失われます。それは漏れです。
OTOH、簡単に解放できますa_global
(そうすべきではありません)、到達可能であり、リークではありません。