トップページ > 過去ログ > 記事閲覧
メモリの開放は・・・
名前:em 日時: 2007/12/11 20:51

初めまして。 少し不思議に感じたことがありましたので、 質問をさせて頂きました。 calloc,mallocでメモリを確保した後、 freeで開放した後にもう一回そこの値を 参照してみると、まだ値を保持している ようなのですが、これは見た目だけ・・・ でちゃんと開放されているのでしょうか? 一応試してみたテストコードを以下に示します。 #include "DxLib.h" #include <stdlib.h> int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) { ChangeWindowMode(TRUE); if(DxLib_Init() == -1) return (-1); SetDrawScreen(DX_SCREEN_BACK); while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) { int *test, *p; test = (int*)calloc(5, sizeof(int)); p = test; for(int i=0; i<5; i++) { *p = i; p++; } printfDx("%d,", test[4]); //4になる free(test); //メモリを開放 printfDx("%d,", test[4]); //無関係な数値になるはず? ScreenFlip(); WaitKey(); } DxLib_End() ; return 0 ; } (開発環境はVisual C++ 2005 Express Edition) 結果は 4,4 となりました。 DXライブラリを使わない 普通のプログラムで同じことをすると、 4,-5339383 等と、開放した後は無関係な数値に なるようです。 タスクマネージャーのメモリーの使用量を 見る限りでは、無限にメモリの使用量が 上がっていくことは無いので、 開放はちゃんとされているとは 思うのですが・・・。 読みづらくて申し訳ありませんが、 よろしければご解答お願いしますm(_ _)m

Page: 1 |

Re: メモリの開放は・・・ ( No.1 )
名前: 日時:2007/12/11 22:50

freeは解放するだけで、初期化は行うわけでは ありません。 解放されたあとのポインタはNULLにしておく事で その後に残ったデータを参照できないようにして おく方が好ましいです。そうしておけば、その ポインタを重複してfree関数に渡すことは無くなる 為、ある程度安全です。
Re: メモリの開放は・・・ ( No.2 )
名前: 日時:2007/12/11 23:08

途中で投稿してしまいましたが、 C言語的にメモリ確保、解放の動作とは、 malloc関数などでサイズ分の領域を割り当て、 アクセスすることが許可される事、 その領域が明示的にfree関数で解放されない限り、 新たな割り当てで、既に割り当てられた領域と 重複しないこと、そしてfree関数が呼ばれた場合 その時点で、割り当てられた領域のメモリへ アクセス出来なくなることです つまり、freeで解放しない限り、自分でメモリ破壊 しない限りは、値の保持が保障されているわけです しかしfreeされた後のメモリ領域が何に使われるか 、どうなるかはまったく予測できません。 >結果は 4,4 となりました まったくの偶然で、たまたま見たところが 変更されなかっただけの話です。 freeした後のメモリにはアクセスしては いけません。
Re: メモリの開放は・・・ ( No.3 )
名前:優柔不断 日時:2007/12/11 23:21

free()の後のメモリにアクセスして起こるバグはよくあるんだそうです。 「たまたま残っている」だけで、「意図して残っている」訳ではないのです。 後はこんなのもしちゃいけないミスです、 int *p; p=(int*)malloc(sizeof(int)*50); 〜 free(p); 〜 free(p); 二重解放はとんでもないバグを生み出します。 ただし、 free(NULL); は何もしないとなっているようです。
Re: メモリの開放は・・・ ( No.4 )
名前:em 日時:2007/12/11 23:27

なるほど、よく分かりました。 丁寧に説明してくださり、 どうもありがとうございましたm(_ _)m

Page: 1 |