- ベストアンサー
[C言語]freeする領域のサイズは誰が管理?
- C言語で動的に領域を確保する際、malloc()関数を使って領域のアドレスを取得します。しかし、領域を解放する際にはfree()関数にアドレスしか与えず、サイズが必要ないことが疑問です。このサイズは誰が管理しているのでしょうか?
- C言語において、動的に確保した領域を解放する際にはfree()関数を使います。しかし、この際には領域のアドレスのみを与えており、サイズを指定する必要がありません。では、領域のサイズは誰が管理しているのでしょうか?
- C言語で領域を動的に確保する際にはmalloc()関数を使用しますが、解放する際にはfree()関数にアドレスを渡すだけでサイズを指定する必要はありません。このため、領域のサイズはどこで管理されているのか疑問に思います。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ランタイムライブラリ次第。ってところもありますけどねぇ……。 現在の一般的なOSならメモリ割り当てなんかはOSが管理しています。 ソレをC言語のランタイムライブラリで覆い隠している場合もあるでしょう。 その際にサイズなどをどう管理するかはランタイムライブラリ側の問題になります。 # まぁ、そう考えればOS側でもサイズなどの情報を持っていることになりますが…。 アプリケーション起動時にそこそこのサイズでOSからメモリを取得、malloc()などがアプリから呼ばれた時にそこから切り取って使う。という方法をとってもいいワケです。 VisualStudioの製品版ならランタイムライブラリのソースコードも入手可能ですし、GNU Cライブラリならそちらもソースコード一式取得可能でしょう。 X68kのOSではリンクリスト構造で管理してましたねぇ。 # 参考にしたMS-DOSでもたぶん同様…でしょう。 strcut { 前のメモリ管理ブロックへのポインタ サイズ 次のメモリ管理ブロックへのポインタ } みたいな構造体をmalloc()で確保した領域の先頭に置いて、 malloc()の戻り値として返却するときに管理用のメモリブロックの直後のアドレスを返す。 とか……。 で、バッファオーバーランやバッファアンダーランするとこの管理ブロックを破壊するのでfree()や次のmalloc()を実行した際に管理ブロックのリスト構造が壊れてて吹っ飛ぶ…とかね。 # Windowsなら一般保護違反とかですね。X68000ではバスエラーだったかなぁ…。 malloc()で返されたアドレスを保持していない(ポインタ操作で進めたとか)の場合も、free()で渡されたアドレスから管理ブロック探そうとしても変なアドレス指しているので…と。 てきと~に見つけた例。 http://www.valinux.co.jp/technologylibrary/document/linux/malloc0001/
その他の回答 (3)
- wormhole
- ベストアンサー率28% (1626/5665)
>「管理する側」とは具体的に何を指すのでしょうか? Cのランタイムライブラリです。 linuxなどでは、Cのランタイムライブラリはソースが公開されていたりしますので読んでみるといいです。 https://www.gnu.org/software/libc/ http://www.uclibc.org/ http://dmalloc.com/ また管理方法にもいろいろあります。 http://ja.wikipedia.org/wiki/Malloc
お礼
ご回答ありがとうございました。 ソースを直接読むのは、今の私にはちょっとキツいですw 管理方法はいろいろな方式があるのですね、勉強になりました。
- kngj1740
- ベストアンサー率18% (197/1052)
C言語の教科書(カーニンハン?)などに例が載ってます。与えたメモリのスタートアドレス、サイズは管理する側で覚えてます。
お礼
ご回答ありがとうございました。 申し訳ありませんが、今ひとつわかりません。 「管理する側」とは具体的に何を指すのでしょうか?
- uruz
- ベストアンサー率49% (417/840)
コンピュータに搭載されているメモリーは全てOSが管理しています。 malloc()でOSに使用したいサイズを申請します、するとこのアドレスを使いなさいと許可が下ります、解放はfree()でOSにこのアドレスで許可された領域はもういらないよと申請します。
お礼
ご回答ありがとうございました。 以前、何かで読んだのですがOSからはある程度まとまった量の領域を一度に確保して、mallocはその領域から切り売りしていると書いてありました。 とすると、mallocから与えられる領域の管理はOSではないのかと思い質問させていただきました。
お礼
ご回答ありがとうございました。 答えとしては、アプリケーションからみるとランタイムライブラリが行う。 ただし管理のやりかたは色々あるよ、ということですね。 ご提示いただきましたリンク先の資料は参考になりました。