プロセスが中断されると、メモリリークが発生しますか?

プロセスが中断されると、メモリリークが発生しますか?

いくつかの変数を手動で割り当てるプログラムをc / C ++で生成するとします。その後、プログラムの実行中に割り込み信号(Ctrl-C)を送信します。これらの変数はメモリから解放されますか、それともシステムがシャットダウンするまでスペースを占めますか?

また、手動で割り当てられていない整数を作成したばかりの場合、これらの変数は持続しますか、それともすぐに削除されますか?

割り当てられた変数はそのまま残り、一般変数は(スタックのために)削除されると思います。このような場合、プログラムが停止した後に割り当てられた変数をメモリから解放する方法はありますか?

ただ気になりました。 :)

ベストアンサー1

プロセスはカーネルによって管理されます。カーネルは、プログラマが変数を割り当てる方法には興味がありません。特定のメモリブロックがプロセスに属することだけを知っています。 C ランタイムは、C メモリ管理機能をカーネル機能と一致させます。自動変数は「スタック」というメモリブロックに入り、ダイナミックストア(mallocおよび友達)は「ヒープ」と呼ばれるメモリブロックに入ります。プロセスは、次のシステムコールを呼び出します。sbrkそしてmmap粒度を次のように取得します。メモリ管理デバイスページ。ランタイムは、これらのブロック内で自動変数と動的に割り当てられたオブジェクトを配置する場所を決定します。

プロセスが終了すると、カーネルはプロセスで使用されなくなった各MMUページを記録するためにメモリ管理テーブルを更新します。これは、独自の違反(システムコール呼び出し)か非違反(信号によって終了)であるか、プロセスが終了する方法に関係なく発生します。どのプロセスでも使用されなくなったページは、再利用可能としてマークされます。

長期実行プログラムでは、コードスニペットをいつ再利用できるかがわからないため、使用されなくなった動的に割り当てられたリポジトリを解放するのが一般的に衛生的です。ただし、プロセスが終了すると、オペレーティングシステムはメモリ、開いているファイルなどのすべてのリソースを解放します。

オペレーティングシステムで自動的にクリーンアップされない唯一のリソースは、一時ファイルなど、オペレーティングシステムのグローバルスコープを持つように設計されたリソースです。

おすすめ記事