
追加質問のようですが、すっきりしないので質問します。
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で質問しましょう!
似たような質問が見つかりました
- 英語 英語についての質問 3 2023/06/16 11:31
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- 邦楽 みなさんが良く聴くアニソンといえばどの曲ですか ? 6 2022/05/05 09:12
- 楽器・演奏 エフェクターについて質問です。 1つのボードの中にfree the toneのRJ-2とmad pr 1 2023/02/23 18:26
- 教えて!goo 教えてgooの OS の部分に Windows11 を追加してほしい 2 2022/08/09 17:06
- その他(OS) OSとCPUの関係について 2 2023/05/04 23:33
- その他(ソフトウェア) Windows10のバックアップ イメージバックアップとフリーソフトバックアップ 5 2023/02/13 17:10
- CPU・メモリ・マザーボード CPUで動作しているOSについての質問です。 3 2023/05/05 00:10
- UNIX・Linux fedoraのリポジトリのインストールで下記コマンドで$(rpm -E %fedora)の部分が分か 1 2023/01/29 15:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
エクセルのメモリ使用状況/Appl...
-
初心者過ぎる質問ですが、VRAM...
-
オブジェクトの開放
-
大容量のメモリ確保をスワップ...
-
組み込み系でのmallocについて
-
if ( a & b == b )
-
ファイルマッピング関数で失敗
-
メモリが不足しています(VBA)
-
ExcelのVBAでメモリ解放できない
-
「memcpy」と「strcpy」について
-
VBAの配列サイズとメモリに関して
-
C++のCopyFileでメモリが増える
-
ゲームプログラミングのマップ...
-
Macターミナルで実行中のプログ...
-
Windows10でDOSゲーム
-
パソコンの演算速度について
-
世界一美しいソースコード
-
家電製品の電力周波数を変える機械
-
Mac 乗数の入力方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
メモリが不足しています(VBA)
-
メモリのセグメント違反の解決...
-
「memcpy」と「strcpy」について
-
メモリ不足
-
「ヒープサイズの設定」て何?
-
エクセルのメモリ使用状況/Appl...
-
C言語における再帰呼び出しの...
-
ファイルマッピング関数で失敗
-
ExitProcessの関数コールについ...
-
EXCEL-VBAにてADOのレコードセ...
-
エクセルVBA 大容量CSVファイル...
-
ExcelのVBAでメモリ解放できない
-
メモリを解放しないとどうなる?
-
バッチファイルでの実行EXEのメ...
-
Bitmapを重ね合わせる方法
-
ルネサスマイコン(R8C) ビルド...
-
C,C++プログラムの強制終了時の...
-
C言語:関数のメモリ上でのサイ...
おすすめ情報