人生のプチ美学を教えてください!!

趣味でプログラミングの勉強をしています。
C言語で、ふと疑問に思いましたので質問させていただきます。

動的に領域を確保するときにはmalloc()にサイズを与えて、その領域のアドレスを取得します。
で、解放するときにはfree()に領域のアドレスを与えます。

ここで疑問に思ったのですが、領域を開放する場合にはその領域のアドレスとサイズが必要ではないかと思うのですが、free()ではアドレスしか与えませんよね?
誰かがアドレスとサイズが対になった情報を管理する必要があると思うのですが、誰が管理しているのでしょうか?

単純に考えてコンパイルしてできた実行形式のファイル中(あるいは呼ばれる外部ライブラリ?)にその機能があると思うのですが、それで合っていますか?


よろしくお願いします。

A 回答 (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/docum …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

答えとしては、アプリケーションからみるとランタイムライブラリが行う。
ただし管理のやりかたは色々あるよ、ということですね。

ご提示いただきましたリンク先の資料は参考になりました。

お礼日時:2013/08/13 05:22

>「管理する側」とは具体的に何を指すのでしょうか?



Cのランタイムライブラリです。
linuxなどでは、Cのランタイムライブラリはソースが公開されていたりしますので読んでみるといいです。
https://www.gnu.org/software/libc/
http://www.uclibc.org/

http://dmalloc.com/

また管理方法にもいろいろあります。
http://ja.wikipedia.org/wiki/Malloc
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

ソースを直接読むのは、今の私にはちょっとキツいですw

管理方法はいろいろな方式があるのですね、勉強になりました。

お礼日時:2013/08/13 05:25

C言語の教科書(カーニンハン?)などに例が載ってます。

与えたメモリのスタートアドレス、サイズは管理する側で覚えてます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

申し訳ありませんが、今ひとつわかりません。
「管理する側」とは具体的に何を指すのでしょうか?

お礼日時:2013/08/12 20:59

コンピュータに搭載されているメモリーは全てOSが管理しています。


malloc()でOSに使用したいサイズを申請します、するとこのアドレスを使いなさいと許可が下ります、解放はfree()でOSにこのアドレスで許可された領域はもういらないよと申請します。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

以前、何かで読んだのですがOSからはある程度まとまった量の領域を一度に確保して、mallocはその領域から切り売りしていると書いてありました。
とすると、mallocから与えられる領域の管理はOSではないのかと思い質問させていただきました。

お礼日時:2013/08/13 05:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!