-PR-
解決済み

mallocとfree

  • 暇なときにでも
  • 質問No.32128
  • 閲覧数542
  • ありがとう数7
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 100% (3/3)

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

http://oshiete1.goo.ne.jp/kotaeru.php3?q=31299で、free()を行った後でもメモリーにアクセスできるというのは、どういう事でしょうか?
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル8

ベストアンサー率 62% (25/40)

プログラムを実行するときには、同時に裏でこっそりメモリ管理屋さんも働いています。
その管理屋さんに、
メモリをこれだけ頂戴といういうのがmalloc()、
もういらないよというのがfree()です。

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

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

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

お礼率 100% (3/3)

回答ありがとうございます。OSによって処理が違うということですね。これからもっと勉強していきます。ありがとうございました。
投稿日時 - 2001-01-26 00:32:44
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル12

ベストアンサー率 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が安定している由縁なのです。
お礼コメント
nao_hig

お礼率 100% (3/3)

回答ありがとうございます。OSによって処理が違うということですね。これからもっと勉強していきます。ありがとうございました。
投稿日時 - 2001-01-26 00:30:29


  • 回答No.3
レベル14

ベストアンサー率 24% (612/2465)

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

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

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

お礼率 100% (3/3)

回答ありがとうございます。OSによって処理が違うということですね。これからもっと勉強していきます。ありがとうございました。
投稿日時 - 2001-01-26 00:33:20
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ