• ベストアンサー

mallocとfree

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

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

  • ベストアンサー
  • y_oku
  • ベストアンサー率62% (25/40)
回答No.2

プログラムを実行するときには、同時に裏でこっそりメモリ管理屋さんも働いています。 その管理屋さんに、 メモリをこれだけ頂戴といういうのがmalloc()、 もういらないよというのがfree()です。 さて、そのメモリ管理屋さんは言葉どおり、 メモリを管理すること「だけ」しかしてくれません。 mallocされた領域はどこからどこまでというのを記憶しておく「だけ」です。 例えて言うなら、「この荷物みていて」といって頼んでおいたのに、 盗まれてしまったときに盗まれるの「見ていた」よという意味の見るだけ。に近いかも。 つまり、主プログラムがポインタを使って特定のメモリを読み書きすることと、 メモリ管理屋さんとはまったく関係がありません。 だからfree()をしても、freeされたことは覚えてるけど、 そこがそのあとどう使われようと関知しないんです。 ここで主プログラムとしてはどうすればよいのでしょう。 ……自分でもメモリを管理する必要があるってことです。 そのためにやることは次の2点です。 ・mallocしたメモリのポインタは保存しておく。 ・必要なくなったらfreeして、同時に必ずそのポインタもNULLにしておく。 これを守らないとメモリリークで無駄にリソースが減っていったり、 別の用途で確保したメモリ領域を書き換えちゃったり、 バグの温床になりますので、気をつけたいですね。

nao_hig
質問者

お礼

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

その他の回答 (2)

  • madman
  • ベストアンサー率24% (612/2465)
回答No.3

y_okuさんの回答のとおりです free()した後はOSが、他のプロセスによりそのメモリ領域が確保されない限りは データはそのまま残りますし、アクセスしても読込・書込み共に出来てしまいます。 ただし、他のプログラムがその領域を確保した場合(OSが他のプログラムに割り振った場合)アクセスしようとすると、coredumpしてしまいます。 UNIXのように複数のプログラムが同時に動作する場合、当然、free()した後にそのメモリにアクセスする事は大変危険です。 当然、行ってはいけません。 しかし、そのことが原因で毎回coredumpするわけではありません。

nao_hig
質問者

お礼

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

  • selenity
  • ベストアンサー率41% (324/772)
回答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が安定している由縁なのです。

nao_hig
質問者

お礼

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

関連するQ&A

  • フリーメールでもらう画像

    No.296406の質問の続きです。パソコンのアドレスに画像を送ってもらえばいいのはわかりましたが、やっぱりプロバイダーのメールでもらった方がいいのでしょうか? デジカメの画像を受け取るとき、グーやヤフーなどのフリーメールでも画像は質を落とすことなく、きれいに見えるのでしょうか? 単純な質問ですいません。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=296406

  • どうか回答待ってます・・眠れないんです・・

    先ほどhttp://oshiete1.goo.ne.jp/kotaeru.php3?q=1576717とhttp://oshiete1.goo.ne.jp/kotaeru.php3?q=1576553で質問したものです。 なんどもしつこいかもしれませんが・・ あまり想像したくないのですが・・。一度あることは二度あるという言葉のとおり、また彼女が他人とやってしまう事があることがあるでしょうか・・

  • 恋愛依存症とは???

    こんにちは!! いつもお世話になってます。。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=629254 http://oshiete1.goo.ne.jp/kotaeru.php3?q=630879 http://oshiete1.goo.ne.jp/kotaeru.php3?q=633725 http://oshiete1.goo.ne.jp/kotaeru.php3?q=644351 ↑↑↑↑↑ 今まで質問してきたものですが これを見て私は恋愛依存症だと思いますか?? 自分でもそうなのかな??と思ったりしますが どうなんでしょう?? そしてどうしたら恋愛依存症から立ち直ることが できますか?? やっぱり趣味とか見つけたり仕事に打ち込んだりするのが一番なんでしょうか?? 私は、今の彼のことで悩んでいますが、 なんとか立ち直りたいんです!! 今の自分がいやでいやで堪らないんです。。 彼だけのことを考えている自分が情けないんです。。 恋愛依存症になったことがある方、そうでなくても構いませんが何かいい方法はないでしょうか?? よろしくお願いします!!

  • フォルダ内のアイコンの表示の仕方について2

    先日http://oshiete1.goo.ne.jp/kotaeru.php3?q=2093889にてお返事を質問をさせて頂いた件でもう一つ追加で教えて頂きたいのですが、特定のフォルダのものだけ大きいアイコンにしたいのですが、そういう事もできるのでしょうか。可能でしたらぜひ教えて頂けますと幸いです。

  • ページAにアクセスしないとページBにアクセスできない・・・

    例えば、B.htmlと言うページがあって、まずA.htmlにアクセスしてからでないとB.htmlにアクセスできないようにするPHPを探しています。 過去にも同じような質問があったので試してみたのですが、できませんでした。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2134159 ↑これです。 もし分かる方がいましたら教えてください。 よろしくお願いします。

    • 締切済み
    • PHP
  • 昨日のテレビ朝日で何が

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1053341 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1053390 等質問があるのですが、23日の7~9時どらえもんの枠で何かあったのですか? ただ単に地震で番組が潰れたというだけのことでしょうか?

  • 今の日本の選択  

    お世話になっております。 サリジェンヌです。 今、日本は重要な局面にいると思います。 今後の日本は弱者切り捨て型社会にすべきか、 国民皆を導いていくべきか皆様のご意見を伺いたく思います。また、前者の場合は、その方向に進んでいるように見えますが、後者の方向に針路変更したい場合はどうしたらよいとお考えでしょうか? 因みにサリジェンヌは後者派です(↓頑張ってきました(参考までに)) http://oshiete1.goo.ne.jp/kotaeru.php3?q=2254612 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2248694 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2245746 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2265951 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2265951 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2126838

  • 名前も電話番号も聞き出した。次はどうすれば・・・?

    下記の関連質問の続きです。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=612642 http://oshiete1.goo.ne.jp/kotaeru.php3?q=652311 http://oshiete1.goo.ne.jp/kotaeru.php3?q=654331 その後、名前と電話番号を教えてもらいました。 これって、多少は脈がありますよね? (ちょっと前までは、可能性があるかないかすらわからなかったので、一歩前進?だと思っているのですが) 日曜日空いているか訊いたところ、「他のバイトが入っているので・・・」とのことでした。 (でも、拒絶という感じではありませんでした) 今後どうしたら、彼女との仲を進展させられるでしょうか? アドバイスを頂けると嬉しいです。

  • 教えてgoo 追加回答の仕方

    お世話になります。 先ほど質問者の方が思い違いをしながら締め切ってしまいました。 確か追加回答がどこかから出来たと思うのですが、ちょっとやり方を見つけられませんでした。 どうすればよいでしょうか? 追加回答したい質問は http://oshiete1.goo.ne.jp/kotaeru.php3?q=1578382 です。

  • 回答者のマナー?

    ここの質問に対する回答 http://oshiete1.goo.ne.jp/kotaeru.php3?q=62568 ここの回答のまるまるコピー! http://oshiete1.goo.ne.jp/kotaeru.php3?q=29341 参考URLぐらい書くべきだと思うんですが・・・ みなさんはどう思われますか?

専門家に質問してみよう