プロが教えるわが家の防犯対策術!

追加質問のようですが、すっきりしないので質問します。

http://oshiete1.goo.ne.jp/kotaeru.php3?q=31299で、free()を行った後でもメモリーにアクセスできるというのは、どういう事でしょうか?

A 回答 (3件)

プログラムを実行するときには、同時に裏でこっそりメモリ管理屋さんも働いています。


その管理屋さんに、
メモリをこれだけ頂戴といういうのがmalloc()、
もういらないよというのがfree()です。

さて、そのメモリ管理屋さんは言葉どおり、
メモリを管理すること「だけ」しかしてくれません。
mallocされた領域はどこからどこまでというのを記憶しておく「だけ」です。
例えて言うなら、「この荷物みていて」といって頼んでおいたのに、
盗まれてしまったときに盗まれるの「見ていた」よという意味の見るだけ。に近いかも。

つまり、主プログラムがポインタを使って特定のメモリを読み書きすることと、
メモリ管理屋さんとはまったく関係がありません。
だからfree()をしても、freeされたことは覚えてるけど、
そこがそのあとどう使われようと関知しないんです。

ここで主プログラムとしてはどうすればよいのでしょう。
……自分でもメモリを管理する必要があるってことです。
そのためにやることは次の2点です。
・mallocしたメモリのポインタは保存しておく。
・必要なくなったらfreeして、同時に必ずそのポインタもNULLにしておく。
これを守らないとメモリリークで無駄にリソースが減っていったり、
別の用途で確保したメモリ領域を書き換えちゃったり、
バグの温床になりますので、気をつけたいですね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。OSによって処理が違うということですね。これからもっと勉強していきます。ありがとうございました。

お礼日時:2001/01/26 00:32

y_okuさんの回答のとおりです



free()した後はOSが、他のプロセスによりそのメモリ領域が確保されない限りは
データはそのまま残りますし、アクセスしても読込・書込み共に出来てしまいます。
ただし、他のプログラムがその領域を確保した場合(OSが他のプログラムに割り振った場合)アクセスしようとすると、coredumpしてしまいます。

UNIXのように複数のプログラムが同時に動作する場合、当然、free()した後にそのメモリにアクセスする事は大変危険です。
当然、行ってはいけません。
しかし、そのことが原因で毎回coredumpするわけではありません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。OSによって処理が違うということですね。これからもっと勉強していきます。ありがとうございました。

お礼日時:2001/01/26 00:33

そもそも、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が安定している由縁なのです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。OSによって処理が違うということですね。これからもっと勉強していきます。ありがとうございました。

お礼日時:2001/01/26 00:30

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