- ベストアンサー
mallocとfree
追加質問のようですが、すっきりしないので質問します。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=31299で、free()を行った後でもメモリーにアクセスできるというのは、どういう事でしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
プログラムを実行するときには、同時に裏でこっそりメモリ管理屋さんも働いています。 その管理屋さんに、 メモリをこれだけ頂戴といういうのがmalloc()、 もういらないよというのがfree()です。 さて、そのメモリ管理屋さんは言葉どおり、 メモリを管理すること「だけ」しかしてくれません。 mallocされた領域はどこからどこまでというのを記憶しておく「だけ」です。 例えて言うなら、「この荷物みていて」といって頼んでおいたのに、 盗まれてしまったときに盗まれるの「見ていた」よという意味の見るだけ。に近いかも。 つまり、主プログラムがポインタを使って特定のメモリを読み書きすることと、 メモリ管理屋さんとはまったく関係がありません。 だからfree()をしても、freeされたことは覚えてるけど、 そこがそのあとどう使われようと関知しないんです。 ここで主プログラムとしてはどうすればよいのでしょう。 ……自分でもメモリを管理する必要があるってことです。 そのためにやることは次の2点です。 ・mallocしたメモリのポインタは保存しておく。 ・必要なくなったらfreeして、同時に必ずそのポインタもNULLにしておく。 これを守らないとメモリリークで無駄にリソースが減っていったり、 別の用途で確保したメモリ領域を書き換えちゃったり、 バグの温床になりますので、気をつけたいですね。
その他の回答 (2)
- madman
- ベストアンサー率24% (612/2465)
y_okuさんの回答のとおりです free()した後はOSが、他のプロセスによりそのメモリ領域が確保されない限りは データはそのまま残りますし、アクセスしても読込・書込み共に出来てしまいます。 ただし、他のプログラムがその領域を確保した場合(OSが他のプログラムに割り振った場合)アクセスしようとすると、coredumpしてしまいます。 UNIXのように複数のプログラムが同時に動作する場合、当然、free()した後にそのメモリにアクセスする事は大変危険です。 当然、行ってはいけません。 しかし、そのことが原因で毎回coredumpするわけではありません。
お礼
回答ありがとうございます。OSによって処理が違うということですね。これからもっと勉強していきます。ありがとうございました。
- selenity
- ベストアンサー率41% (324/772)
そもそも、malloc関数は動的にメモリの空き領域を 確保する機能です。 また、使いおえた後はfreeで開放します。 DOSやWindowsはメモリ管理が非常にルーズなので 適当なプログラムを書いても動作している様に 見えるだけです。 理由としては、WindowsがSingle UserのOSだからです。 UNIXみたいなMulti UserのOSだと自分以外の人も 同じCPUを使用しているため、自分が使うためのメモリ を確保しておく必要があります。 基本的に全てのメモリ領域の所有者はOSであり、OSは 各ユーザからメモリ確保要求が来たら、自分が管理 している領域の一部をユーザに貸し与えるのです。 したがって、ユーザから開放されたメモリ領域は OSが所有者になります。 自分が確保したメモリ領域は他人からはアクセス 出来ない様になっています。 したがって、一度開放したメモリ領域は、他人に 使われている可能性があるわけです。 他人に使われていなくても、OSという他人が 所有者なのでアクセスできません。 言ってみれば、領海侵犯な訳です。 Windows9x,Meは空きメモリは所有者はいませんので 誰でも好き勝手に書き込めます。 特に VC++だと、、、 だから動作するのです。 WinNT,2kだともう少しまともになっていて、 空きメモリはの所有者はSYSTEMになっています。 そのため一般ユーザの勝手なアクセスは できないはずです。 んでもって、この辺がNT,2kが安定している由縁なのです。
お礼
回答ありがとうございます。OSによって処理が違うということですね。これからもっと勉強していきます。ありがとうございました。
お礼
回答ありがとうございます。OSによって処理が違うということですね。これからもっと勉強していきます。ありがとうございました。