他の回答に加えて、Boehm の保守的なガベージ コレクターGC_malloc
を使用することを検討できます。その場合は、代わりに使用malloc
し、何もしませんfree
(メモリ ゾーンが役に立たなくなり、到達不能になることが絶対に確実な場合でも、明示的にそれを行うことができますGC_free
) 。 .
ただし、Cfree
のポイントは、 -d データ ゾーンを使用できないことです。これを行うことは未定義の動作であり、何かが起こる可能性があります。
「なぜまだ無効なアドレスにアクセスできるのか」( free
-d ゾーン内) という質問については、答えは実装固有です。実際には、Linux では、カーネルからのメモリの取得はmmap(2) (または場合によってsbrk(2)
は ) を介して行われ、解放はシステムコールを介して行われmunmap(2)
ます。これは、何らかの理由で高価な操作であり、複数のページ長 (多くの場合 4K バイト) を処理します。そのため、実装は多くのsyscallmalloc
を実行することを回避しようとします。そのため、通常は -d メモリ ゾーンを別の方法で管理し、syscallを実行せずにさらに再利用できるように編成します。これは、メモリ ゾーンがまだ存在していることを示しています (内部にある場合でも)。mmap
munmap
free
malloc
mmap
malloc
内部簿記)にアクセスできます。しかし、そうすることで の内部不変条件が壊れ、malloc
大混乱が後で起こります。
/proc/1234/maps
ところで、アドレスがアドレス空間内にある場合、アドレスは有効であり、ファイル (Linux で指定されたテキスト コンテンツを含む疑似ファイル) を (順次) 読み取ることで、プロセス 1234 のアドレス空間を照会できます。プロセス内から読み取ります/proc/self/maps
。詳細を理解するcat /proc/self/maps
には、そのコマンドを実行しているプロセスのアドレス空間を表示するコマンドを試してください。proc(5)の man ページcat
を参照してください。
簡単なプログラムを試してstrace
、どのようなシステムコールを行っているかを理解してください。