2011-09-01 18 views
9

は、次のコードを考える:上記のコードはコンパイルして実行されるCtrl-Cを使用してプログラムが中断されたときに、動的に領域を解放する方法はありますか?

#include <stdio.h> 

int main() 
{ 
    int *p; 
    p = (int *)malloc(10 * sizeof(int)); 

    while(1); 
    return 0; 
} 

を、そしてはCtrl + Cを押している間、実行中に中断され、どのようにpに割り当てられたメモリが解放されますか?ここでオペレーティングシステムの役割は何ですか?そして、C++の場合は、new演算子を使ってどのように違いますか?

+7

オペレーティングシステムは、プロセスの終了に関係なく、プロセスが終了するとすべてを再要求します。 –

+0

'Ctrl + C 'の特別な点は何ですか? –

+0

OSはどのようにメモリを再利用しますか?具体的には、OSのどのコンポーネントがそれを担当していますか? – 4sh1sh

答えて

13

プロセスが終了すると、オペレーティングシステムはプロセスが使用していたすべてのメモリを再要求します。

OSが終了したときにOSが使用していたメモリを再利用しても、人々がメモリリークを大量に発生させる理由は、通常、ほとんどのアプリケーションが長時間実行されてゆっくりとすべてのメモリをシステム。非常に寿命の短いプログラムではそれほど問題はありません。 (ワンライナーは巨大なプログラムとなりますので、小さなプログラムで任意のメモリリークを持っていないときしかし、あなたが言うことはありません。)

+0

あなたは、OSがどのようにプロセスが使用していたメモリを再利用するかについてもう少し説明できますか? OSのためにこれを行う特定のプロセス? – 4sh1sh

+0

@ 4sh1sh各プログラムは独自のスタックとフリーストア(ヒープ)を取得します。プログラムが 'new' /' delete'を呼び出すと、フリーストアを使い始める。プログラムが終了すると、OSはスタックやその他すべてのメモリを取り込みます。フリーストア内の特定のメモリブロック(例えば、 'new'dや' delete'dなど)が使われていたことは気にしません。それは全体を取り戻すだけです。 –

+0

OSには特定のプロセス、特にUNIXがありますか? – 4sh1sh

3

をところで(セス・カーネギーのほかに言った):

<signal.h>のルーチンを使用して

例は、このように損失を避け、クローズファイルのように(だけでなく、メモリを任意の重要なリソースをクリーンアップするためにあなたは、どのような方法でCtrlキー + Cを処理するためSIGINT信号(割り込み)をキャッチすることができますバッファリングされていてまだ書き込まれていないコンテンツの、またはネットワーク接続を静かに閉じて)

0

メモリは実際には "free()"ではありません。

オペレーティングシステムが取得するメモリは、ページサイズ(通常は4kバイトのメモリ)です。プロセスがメモリを使い果たすたびに、それは追加のページを取得します。これらはmalloc()が実際に使用する領域です。プロセスが終了すると、すべてのページがオペレーティングシステムに返され、freeを実際には不要にします。あなたのプログラムがサーバかそれと同様であれば、決して解放されないメモリのすべての部分は、プログラムが実際に殺されたときにのみ返されます。

関連する問題