プロが教えるわが家の防犯対策術!

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

A 回答 (3件)

%x で出力するなら unsigned int にキャストしてやってください>#2.



というか, ポインタなんだから素直に %p で出せばいいだけなんだけど.
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/04/27 23:24

開発環境はなんでしょうか?


VC++であれば、crtdbgなどがあります。
http://d.hatena.ne.jp/wata_d/20080304/1204609100

CygwinのGccとかであればmtrace、Valgrindなどですかね。
http://blogs.dion.ne.jp/umasuke/archives/5645894 …
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による確保では仮想メモリの確保なので、歯抜け領域しかなくても確保できます。
基本的にメモリ断片化での障害はパフォーマンス低下です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>開発環境はなんでしょうか?
VisualStadio2008 です。
crtdbgですね、参考にしたいと思います。

mymalloc() myfree()の手法、ありがとうございます。
可視化ツールとしては、デフラグの様に、メモリ使用中、未使用を色分け表示してくれるようなツールを希望していますが、確かに、お教えいただいた方法でも可視化できますね、ありがとうございます。

でも、実は、今回は使えないのです。
質問では、malloc()-free()を直接呼び出しているような、書き方をしましたが、実際は、
 CreateCompatibleBitmap();
 DeleteObject();
を呼び出していて、その中で、malloc()-free()を呼び出している筈だということで、あのような質問にしました。
 CreateCompatibleBitmap();の中のmalloc();を呼び出している部分の書き換えはちょっと無理なので、今回は使えないのです。

>断片化でメモリ確保に失敗するのは、連続する物理メモリアドレスの確保など特殊な例に限ると思います。
そう思っていますが、メモリ確保ー開放を繰り返すと、真っ黒な画像になるなどのトラブルが発生してしまうのです。

お礼日時:2012/04/27 23:22

ちょっとズレてるかもしれませんが。



監視ツールとしてはタスクマネージャーがそこそこ使いやすいです。

プログラムにデバッガを埋め込めるのなら、
簡単なmalloc、freeをラップして確保量の推移ログを取るような関数を作成したりしますね。

同時に開発環境の警告値やデバッグ機能を最高レベルに設定することで、
メモリのリークや破壊についてはある程度洗い出しできます。

これらを自動的に行ってくれるようなツールやライブラリはあるにはありますが、
無償の物でまともに動作、埋め込んでコンパイルできる物は見たことがありません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/04/27 23:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!