• 締切済み

malloc でのメモリ取得状況の可視化

Cで作成したWinXPで動くプログラムです。 malloc - free を繰り返して使っていると、どうもメモリが断片化するらしく、よくメモリ不足でエラーになります。free で開放したつもりで、開放できていないという可能性も否定できません。 そこで、メモリ確保状態を可視化できるツールなどありましたら紹介お願いします。 アプリのソースリストがありますので、可視化するプログラムを埋め込むことも可能です。そのようなライブラリのご紹介も歓迎です。 よろしくお願いいたします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

%x で出力するなら unsigned int にキャストしてやってください>#2. というか, ポインタなんだから素直に %p で出せばいいだけなんだけど.

usatan2
質問者

お礼

ご指摘の回答ありがとうございます。

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.2

開発環境はなんでしょうか? VC++であれば、crtdbgなどがあります。 http://d.hatena.ne.jp/wata_d/20080304/1204609100 CygwinのGccとかであればmtrace、Valgrindなどですかね。 http://blogs.dion.ne.jp/umasuke/archives/5645894.html Linux用なんで、Cygwin環境でいけるかどうか知りませんけど。 もっと原始的には void *mymalloc(int size) {  void *p = malloc(size);   printf("alloc:%x\n", p);   return p; } void myfree(void *p) {   printf("free:%x\n", p);   free(p); } #define malloc mymalloc #define free myfree こんな感じでallocのアドレスとfreeのアドレス一致を確認することで 可視化できます。 断片化でメモリ確保に失敗するのは、連続する物理メモリアドレスの確保など特殊な例に限ると思います。 普通のmallocによる確保では仮想メモリの確保なので、歯抜け領域しかなくても確保できます。 基本的にメモリ断片化での障害はパフォーマンス低下です。

usatan2
質問者

お礼

回答ありがとうございます。 >開発環境はなんでしょうか? VisualStadio2008 です。 crtdbgですね、参考にしたいと思います。 mymalloc() myfree()の手法、ありがとうございます。 可視化ツールとしては、デフラグの様に、メモリ使用中、未使用を色分け表示してくれるようなツールを希望していますが、確かに、お教えいただいた方法でも可視化できますね、ありがとうございます。 でも、実は、今回は使えないのです。 質問では、malloc()-free()を直接呼び出しているような、書き方をしましたが、実際は、  CreateCompatibleBitmap();  DeleteObject(); を呼び出していて、その中で、malloc()-free()を呼び出している筈だということで、あのような質問にしました。  CreateCompatibleBitmap(); の中のmalloc();を呼び出している部分の書き換えはちょっと無理なので、今回は使えないのです。 >断片化でメモリ確保に失敗するのは、連続する物理メモリアドレスの確保など特殊な例に限ると思います。 そう思っていますが、メモリ確保ー開放を繰り返すと、真っ黒な画像になるなどのトラブルが発生してしまうのです。

回答No.1

ちょっとズレてるかもしれませんが。 監視ツールとしてはタスクマネージャーがそこそこ使いやすいです。 プログラムにデバッガを埋め込めるのなら、 簡単なmalloc、freeをラップして確保量の推移ログを取るような関数を作成したりしますね。 同時に開発環境の警告値やデバッグ機能を最高レベルに設定することで、 メモリのリークや破壊についてはある程度洗い出しできます。 これらを自動的に行ってくれるようなツールやライブラリはあるにはありますが、 無償の物でまともに動作、埋め込んでコンパイルできる物は見たことがありません。

usatan2
質問者

お礼

タスクマネージャですか。参考にさせていただきます。

関連するQ&A

  • 仮想メモリでない環境でのmalloc freeのよいアルゴリズムを教えてください

    ゲーム機の開発をしています。 仮想メモリがないので、mallocとfreeを不定の順序で繰り返しているとヒープ領域が断片化し、そのうちにメモリは不足していないはずなのにmallocできなくなります。ゲーム機のSDKにはそういうことを想定しているのか malloc、free の代替関数を設定できるようになっています。そこで、代替関数を用意しようと考えていると考えています。 完全に断片化をさけるには、mallocした逆順にfreeするとか使い方の工夫をしないと無理とは思いますが、通信系のライブラリにの内部などでmallocしていたりして完全にはこちらの思うとおりにはできません。テクスチャーなどの常駐でなるべく多くのメモリを使いたいので、ヒープ領域はできるだけ小さくすませたいのです。どんなアルゴリズムでも、ある程度の断片化はさけられないと思いますが、malloc、freeのよいアルゴリズムが紹介されているところがありましたら、御教えください。使われ方との相性があると思いますので、複数のアルゴリズムが紹介されていればうれしいです。

  • mallocとfree

    struct list *p; /* 記憶領域の確保 */ if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) { printf("malloc error\n"); exit(1); } とサンプルプログラムがあるのですが、if分の意味がわかりません。 また、mallocを使った場合freeで開放とあるのですが、 どういう意味なのかわかりません。 よろしければ、上記2つの点について教えてください。

  • メモリ操作関数『malloc(),free()』

    /*10バイトのメモリ領域を確保し、その領域に文字列"Allocate"を代入せよ。*/ /*ただし、確保した領域は、プログラム終了までに開放すること。*/ #include<stdio.h> #include<stdlib.h> void main(void) { char *ptr; ptr = (char *)malloc(10); printf("Allocate\n"); free(ptr); } 今、ライブラリ関数を勉強しています。 この問題をとりあえず作ってみて、実行も成功したのですが、10バイトのメモリ確保の数値を変えても、何も変わらないため本当に問題の要求どおりのプログラムが作れているのか謎です。 間違っているなどのアドバイス宜しくお願いします。

  • malloc関数 free開放とはなんですか?

    malloc関数を用いてメモリを確保した後、 必ずfreeで開放を行わなければならないですよね? この開放とはどういう意味なのでしょうか?

  • mallocしたメモリの開放

    かなり基本的なことですいませんが、 下記のようなイメージのコードで確保したメモリを 確実に開放するにはどうしたらいいでしょうか? やりたいこととしては、動的に確保したメモリにデータを 入れて、それをベクトルに入れて使いまわしたいです。 下記のコードからfreeの部分をやめても大丈夫でしょうか?その場合、どうやってメモリ開放するんでしょうか? ベクトルが消滅すればメモリが開放されるんでしょうか? テストしてみましたが、減った気配がない。。。 根本的に考え方がおかしいかもしれません。。。 お助けください。 お願いします。 wchar_t str[6] = L"あいうえお"; wchar_t* mem = (wchar_t*)malloc(6 * sizeof(wchar_t)); wcsncpy(mem, str, 6); std::vector<wchar_t*> vetorTemp; //実際グローバル変数 vetorTemp.insert(vetorTemp.end(), mem); free(mem); // ここで開放するとvetorTempの中身も利用できなくなってしまった

  • mallocで確保したメモリをfree解放する必要

    当方、C言語を勉強中です。 mallocで確保しておいたメモリをfreeで必ず解放するようにと教わりました。 freeで開放しないことをひどく野蛮な言葉で例えられたのですが、それほどまでに必要である実感が実はあまりありません。 ファイルポインタでファイルを開いているときに、プログラムが終了すると開いているファイルを自動的に閉じるように、プログラムが終了すると自動的に解放されるものと思っていたのですが、やはりこちらはプログラム終了後も確保されたままになってしまうのでしょうか。 また、解放しないことによるデメリットで、メモリを圧迫する以外にはなにがあるのでしょうか。 ご教授おねがいします。

  • mallocの書式について

    初心者です。プログラム上でメモリを確保するmallocという関数がありますが書式がいまいち良くわかりません・・。   戻り値? * malloc(確保する型 * 確保する数) のように書いてますけどmallocの前のはやはり戻り値?そのまえの*は?いまいちわかりません。よろしくお願いします。

  • C言語 mallocとfreeについて

    mallocとfreeを何度も繰り返していると、メモリがどんどん増えていき、最終的にはプログラムが止まってしまいます。 いくつかのページでメモリ確保を繰り返すとメモリをかなり食ってしまうと書いてありました。 これに対する解決策をご存知の方いらっしゃいましたら教えてください。 よろしくお願いします。

  • mallocでメモリーを確保しようとすると暴走します

     組み込み系のプログラミングをやっているもので、malloc、freeを使って動的にメモリーの確保、開放を行っているのですが、途中で暴走してしまいます。 (mallocを呼び出すと、返ってこなくなります。)    そこでmallocの動作を見ようと、以下のプログラムを作って動作させると、while文の中を一周はするのですが、2週目のp2のポインターの値が返ってきません。(malloc関数の中でloopしています。)     /* 以下ソースコード */  char *p1;  char *p2;  char *p3;  char *p4;  while(1){    p1 = (char*)malloc(100);    p2 = (char*)malloc(100);    p3 = (char*)malloc(100);    free(p3);    p4 = (char*)malloc(100);    free(p4);    free(p2);    free(p1);  }  ※メモリーは、2k確保していあるので、サイズがオーバーしているということはないと思います。  ご質問ですが、  ・上記ソースコードで暴走するような要因がありますでしょうか?  ・malloc、free関数でメモリーの取得、開放の順番など注意しないといけないことがあるのでしょうか?  ・malloc、free関数等を自作とかされていますでしょうか?  どうぞよろしくお願い致します。

  • メモリの開放について

    いつもお世話になっております。 メモリ開放のお作法について教えてください。 int* p ; p = (int*)malloc( 100 * sizeof( int ) ) ;  ※ p = (int*)malloc( 100 * sizeof( int ) ) ;  ※ p = (int*)malloc( 100 * sizeof( int ) ) ; free(p); このような記述をした場合、※の付いている2行でメモリ確保した 領域は開放されるのでしょうか。 (メモリ確保に失敗した場合の処理は省略してます。) よろしくお願いします。

専門家に質問してみよう