![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
追加質問のようですが、すっきりしないので質問します。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=31299で、free()を行った後でもメモリーにアクセスできるというのは、どういう事でしょうか?
No.2ベストアンサー
- 回答日時:
プログラムを実行するときには、同時に裏でこっそりメモリ管理屋さんも働いています。
その管理屋さんに、
メモリをこれだけ頂戴といういうのがmalloc()、
もういらないよというのがfree()です。
さて、そのメモリ管理屋さんは言葉どおり、
メモリを管理すること「だけ」しかしてくれません。
mallocされた領域はどこからどこまでというのを記憶しておく「だけ」です。
例えて言うなら、「この荷物みていて」といって頼んでおいたのに、
盗まれてしまったときに盗まれるの「見ていた」よという意味の見るだけ。に近いかも。
つまり、主プログラムがポインタを使って特定のメモリを読み書きすることと、
メモリ管理屋さんとはまったく関係がありません。
だからfree()をしても、freeされたことは覚えてるけど、
そこがそのあとどう使われようと関知しないんです。
ここで主プログラムとしてはどうすればよいのでしょう。
……自分でもメモリを管理する必要があるってことです。
そのためにやることは次の2点です。
・mallocしたメモリのポインタは保存しておく。
・必要なくなったらfreeして、同時に必ずそのポインタもNULLにしておく。
これを守らないとメモリリークで無駄にリソースが減っていったり、
別の用途で確保したメモリ領域を書き換えちゃったり、
バグの温床になりますので、気をつけたいですね。
No.3
- 回答日時:
y_okuさんの回答のとおりです
free()した後はOSが、他のプロセスによりそのメモリ領域が確保されない限りは
データはそのまま残りますし、アクセスしても読込・書込み共に出来てしまいます。
ただし、他のプログラムがその領域を確保した場合(OSが他のプログラムに割り振った場合)アクセスしようとすると、coredumpしてしまいます。
UNIXのように複数のプログラムが同時に動作する場合、当然、free()した後にそのメモリにアクセスする事は大変危険です。
当然、行ってはいけません。
しかし、そのことが原因で毎回coredumpするわけではありません。
No.1
- 回答日時:
そもそも、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が安定している由縁なのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
【C言語】再帰が時間がかかる...
-
ファイルマッピング関数で失敗
-
エクセルのメモリ使用状況/Appl...
-
メモリのセグメント違反の解決...
-
「memcpy」と「strcpy」について
-
mmap()
-
Apacheでバーチャルホストの最...
-
C言語で、メモリを解放しないで...
-
ReadEventLogについて
-
C言語 昇順・降順 ソート
-
メモリ不足
-
HEWでのビルド
-
H8について教えて下さい。
-
C言語における再帰呼び出しの...
-
プログラマのためのPC選び(パ...
-
fortranプログラムについて
-
デバッグツール,Efenceでのmma...
-
メモリアロケーション異常の発...
-
C#におけるexeファイルのサイズ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
これて逆じゃないですか?
-
【C言語】再帰が時間がかかる...
-
エクセルのメモリ使用状況/Appl...
-
メモリのセグメント違反の解決...
-
エクセルVBA 大容量CSVファイル...
-
メモリ不足
-
メモリが不足しています(VBA)
-
C言語における再帰呼び出しの...
-
「ヒープサイズの設定」て何?
-
エクセル キャッシュメモリー...
-
EXCEL-VBAにてADOのレコードセ...
-
バッチファイルでの実行EXEのメ...
-
closeとメモリの開放について
-
ExcelのVBAでメモリ解放できない
-
C言語初心者です。debug assert...
-
動的メモリとexit(C言語)
-
大容量のメモリ確保をスワップ...
-
メモリの解放の仕方
おすすめ情報