web-dev-qa-db-ja.com

終了する前にメモリを解放する必要がありますか?

エラーのためにプログラムを終了するときに、割り当てられていないメモリをすべて解放する必要がありますか?

something = (char**) malloc (x * sizeof(char*));
for (i = 0; i < x; i++)
    something[i] = (char*) malloc (y + 1);

...

if (anything == NULL) {
   printf("Your input is wrong!");
   // should I free memory of every mallocated entity now?
   exit(1);
} 
else {
   // work with mallocated entities
   ...
   free(something); // it must be here
   system("pause);
}
22
Lucfia

OSに依存します。ベストプラクティス明示的に解放する必要があると思います。また、メモリがどこにでも解放されておらず、良い点と悪い点がわからない場合は、valgrindなどのツールをPITAで使用できます。

明示的にメモリを解放するOS上にある場合でも、他のリソースの問題が発生します。アプリが成長し、サードパーティのライブラリを取り込むようになると、リソースリークが発生する可能性があります。ハンドラーでcloseを呼び出すように要求するライブラリーを書いたとします。このハンドラは、closeを呼び出さない限り削除されない一時ファイルによってサポートされています。または、シグナルや他の知らないリソースを使用して管理しているバックグラウンドで実行されているプロセスを切り離しました。

7
Harry

これは実際には非常に難しい、不可解な質問です。

プロ(終了前にすべてを解放することを支持して):

  • コードを再配置しても、バグやメモリリークはありません
  • valgrindまたはメモリリークチェッカーからの誤検知なし
  • バグのあるOSで実行している場合、またはOSがまったくない場合、メモリリークはありません。

コン(ただ終了、すべてを解放することについて心配しないでください):

  • すべてを解放するのは大変な作業です
  • すべてを解放すると、バグやクラッシュが発生する可能性があります
  • あなたのOSは本当に、あなたが終了するときにあなたのためにすべてのリソースを再利用するべきです

そして、もう1つのポイント(賛成か反対かはわかりません):ほとんどのシステムでは、freeを呼び出すとnotメモリをオペレーティングシステムに返します(終了する場合に限ります)。

最後に、あなたはこれらの長所と短所のどれがあなたにとって最も重要であるかを決定する必要があります。さまざまな状況でさまざまなプロジェクトのさまざまなプログラマは、さまざまな結論に達します。ここには万能の答えはありません。

この以前のスタックオーバーフローの質問 も参照してください。 C FAQ listquestion 7.24 も参照してください。

22
Steve Summit

プログラムを終了する前にメモリを解放する必要はありません。何らかの方法でプログラムを終了すると、すべてのメモリが自動的に割り当て解除されます。

10
fuz

終了する前に、常に割り当てられたメモリを解放する必要があります。他の回答ですでに述べたように、これにより静的または動的分析ツールなどからの警告が最小限に抑えられます。

しかし、常にこれを行うべきである本当の理由は、解放するとアプリケーションの休止ランタイムバグが明らかになることが多いためです。

メモリの破損やポインタアドレスの変更を引き起こすバグがどこかにある場合、そのバグは何も表示されず休止状態のままになることがあります。バグにまったく関係のないものを変更して、メモリレイアウトを変更するまで。すると、突然クラッシュして、なぜかわからなくなります。バグは、追加したばかりのコードにさえないためです。

メモリを解放することにより、そのようなバグを誘発します。ヒープまたはヒープを指しているポインターに問題がある場合、free()を呼び出したときにクラッシュすることがよくあります。つまり、どこかに深刻なバグがあり、プログラムを出荷する前に見つける必要があるということです。

7
Lundin

私は完全に反対のシナリオを持っていました:サードパーティのライブラリからの静的オブジェクトのデストラクタをセグメンテーションフォールトしました。終了する前にメモリプールを明示的に解放したからです。合理的で、プログラム構造に集中する方が良いと思います。

0
Yura