• 締切済み

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
質問者

お礼

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