3

関連する 2 つの質問があるため、この 1 つのスレッドで質問しています。

Q1) プログラムの終了時に、OS が解放されていないメモリ (malloc を使用して割り当てられた) を自動的にクリアしているかどうかを確認するにはどうすればよいですか? gcc-4.5.2で32ビットのUbuntu 11.04を使用しています

ここのSteven Summitによるチュートリアルページによると、「未使用のメモリ(mallocされたもの)を解放することは良い考えですが、必須ではありません。プログラムが終了すると、割り当てられたが解放されていないメモリは自動的に解放されます。プログラムがメモリを解放するのを忘れたという理由だけで、コンピュータがメモリを何らかの形で「失う」ことになった場合、それはオペレーティング システムに問題または欠陥があることを示しています。

Q2) foo.c が B バイトのメモリを malloc するとします。その後、foo.c はこの B バイトのメモリ ロケーションを解放し、OS に返します。ここで私の質問は、これらの特定の B バイトのメモリ位置を現在のインスタンスで (OS によって) foo.c に再割り当てできるか、または現在のインスタンスが終了するまでそれらの B バイトを foo.c に割り当てることができないかです。 ?

編集: 私の質問を読むすべての人に、ここここで同様の質問への回答を読むことをお勧めします。どちらの回答も、非常に難解な用語を使用せずに、malloc() と free() の相互作用と動作を詳細に説明しています。カーネルで使用されるメモリ管理ツール (brk()、mmap() など) と C コンパイラで使用されるメモリ管理ツール (malloc()、free() など) の違いを理解するには、これを読む必要があります。

4

4 に答える 4

2

プロセスが終了シグナル、たとえばSIGSEGV、または_exit(2)システム コール ( から戻ったときにも呼び出されるmain) によって終了すると、すべてのプロセス リソースがカーネルによって解放されます。特に、ヒープ メモリ ( mmap(2) (またはおそらくsbrk(2)) syscall (mallocライブラリ関数によって使用される)で割り当てられる) を含むプロセス アドレス空間が解放されます。

もちろん、freeライブラリ関数は、(多くの場合) 解放されたメモリ ゾーンを将来の呼び出しで再利用できるようにするmallocか、(場合によっては、大きなメモリ ゾーンの場合)munmap(2)システム コールなどを使用して大きなメモリ チャンクをカーネルに解放します。

プロセス 1234 のメモリ マップについて詳しく知るには、/proc/1234/maps疑似ファイルを (または/proc/self/mapsプロセス内から) 順番に読み取ります。/procファイル システムは、カーネルにプロセスに関するクエリを実行するための推奨される方法です。(他にも興味深いものがたくさんあります)/proc/self/statm/proc/self/smaps

freeとの詳細な動作mallocは実装に依存します。mallocヒープ メモリを取得する方法freeとして、また、以前にmalloc-ed されたゾーンは役に立たず、システム (つまり、標準 C ライブラリ + カーネル) はそれを使って何でもできると言う方法として見る必要があります。

valgrindを使用してメモリ リークのバグを探します。Boehm の保守的なガベージ コレクターの使用を検討することもできます。つまり、GC_malloc代わりに使用mallocし、手動でメモリを解放する必要はありません。

于 2012-04-25T07:37:46.917 に答える
2

最近のほとんどの OS は、割り当てられたメモリを再利用するため、心配する必要はありません。
OSは、アプリケーション/プログラムがメモリをリークしたかどうかを理解していません。プロセスが完了すると、プロセスに割り当てられたものを単に再利用します。

はい、解放されたメモリは(必要に応じて)再利用でき、再利用は同じインスタンス化で発生する可能性があります。

于 2012-04-25T07:37:14.433 に答える
1

Q1. オペレーティング システムが正しく動作していると仮定する必要があります。

Q2. バイトを foo.c に再割り当てできない理由はありません。メモリ割り当てルーチンがどのように機能するかにかかっているだけです。

于 2012-04-25T07:37:21.783 に答える
1

Q1) 確認方法がわかりません。ただし、2 番目の段落については、割り当てたメモリを常に解放するのが良いスタイルと考えられています。これについての良い説明は、次のとおりです。.

Q2) 確かに; これらのバイトは通常、最初に再割り当てされます (malloc の実装によって異なります)。優れた説明については、以下を参照してください: malloc() と free() はどのように機能しますか? .

于 2012-04-25T07:49:42.283 に答える