- 締切済み
malloc でのメモリ取得状況の可視化
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
%x で出力するなら unsigned int にキャストしてやってください>#2. というか, ポインタなんだから素直に %p で出せばいいだけなんだけど.
- jjk65536
- ベストアンサー率59% (66/111)
開発環境はなんでしょうか? 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による確保では仮想メモリの確保なので、歯抜け領域しかなくても確保できます。 基本的にメモリ断片化での障害はパフォーマンス低下です。
お礼
回答ありがとうございます。 >開発環境はなんでしょうか? VisualStadio2008 です。 crtdbgですね、参考にしたいと思います。 mymalloc() myfree()の手法、ありがとうございます。 可視化ツールとしては、デフラグの様に、メモリ使用中、未使用を色分け表示してくれるようなツールを希望していますが、確かに、お教えいただいた方法でも可視化できますね、ありがとうございます。 でも、実は、今回は使えないのです。 質問では、malloc()-free()を直接呼び出しているような、書き方をしましたが、実際は、 CreateCompatibleBitmap(); DeleteObject(); を呼び出していて、その中で、malloc()-free()を呼び出している筈だということで、あのような質問にしました。 CreateCompatibleBitmap(); の中のmalloc();を呼び出している部分の書き換えはちょっと無理なので、今回は使えないのです。 >断片化でメモリ確保に失敗するのは、連続する物理メモリアドレスの確保など特殊な例に限ると思います。 そう思っていますが、メモリ確保ー開放を繰り返すと、真っ黒な画像になるなどのトラブルが発生してしまうのです。
- duke_kimura
- ベストアンサー率39% (53/134)
ちょっとズレてるかもしれませんが。 監視ツールとしてはタスクマネージャーがそこそこ使いやすいです。 プログラムにデバッガを埋め込めるのなら、 簡単なmalloc、freeをラップして確保量の推移ログを取るような関数を作成したりしますね。 同時に開発環境の警告値やデバッグ機能を最高レベルに設定することで、 メモリのリークや破壊についてはある程度洗い出しできます。 これらを自動的に行ってくれるようなツールやライブラリはあるにはありますが、 無償の物でまともに動作、埋め込んでコンパイルできる物は見たことがありません。
お礼
タスクマネージャですか。参考にさせていただきます。
関連するQ&A
- 仮想メモリでない環境でのmalloc freeのよいアルゴリズムを教えてください
ゲーム機の開発をしています。 仮想メモリがないので、mallocとfreeを不定の順序で繰り返しているとヒープ領域が断片化し、そのうちにメモリは不足していないはずなのにmallocできなくなります。ゲーム機のSDKにはそういうことを想定しているのか malloc、free の代替関数を設定できるようになっています。そこで、代替関数を用意しようと考えていると考えています。 完全に断片化をさけるには、mallocした逆順にfreeするとか使い方の工夫をしないと無理とは思いますが、通信系のライブラリにの内部などでmallocしていたりして完全にはこちらの思うとおりにはできません。テクスチャーなどの常駐でなるべく多くのメモリを使いたいので、ヒープ領域はできるだけ小さくすませたいのです。どんなアルゴリズムでも、ある程度の断片化はさけられないと思いますが、malloc、freeのよいアルゴリズムが紹介されているところがありましたら、御教えください。使われ方との相性があると思いますので、複数のアルゴリズムが紹介されていればうれしいです。
- ベストアンサー
- C・C++・C#
- mallocとfree
struct list *p; /* 記憶領域の確保 */ if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) { printf("malloc error\n"); exit(1); } とサンプルプログラムがあるのですが、if分の意味がわかりません。 また、mallocを使った場合freeで開放とあるのですが、 どういう意味なのかわかりません。 よろしければ、上記2つの点について教えてください。
- ベストアンサー
- C・C++・C#
- メモリ操作関数『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バイトのメモリ確保の数値を変えても、何も変わらないため本当に問題の要求どおりのプログラムが作れているのか謎です。 間違っているなどのアドバイス宜しくお願いします。
- ベストアンサー
- C・C++・C#
- malloc関数 free開放とはなんですか?
malloc関数を用いてメモリを確保した後、 必ずfreeで開放を行わなければならないですよね? この開放とはどういう意味なのでしょうか?
- ベストアンサー
- C・C++・C#
- 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の中身も利用できなくなってしまった
- 締切済み
- C・C++・C#
- mallocで確保したメモリをfree解放する必要
当方、C言語を勉強中です。 mallocで確保しておいたメモリをfreeで必ず解放するようにと教わりました。 freeで開放しないことをひどく野蛮な言葉で例えられたのですが、それほどまでに必要である実感が実はあまりありません。 ファイルポインタでファイルを開いているときに、プログラムが終了すると開いているファイルを自動的に閉じるように、プログラムが終了すると自動的に解放されるものと思っていたのですが、やはりこちらはプログラム終了後も確保されたままになってしまうのでしょうか。 また、解放しないことによるデメリットで、メモリを圧迫する以外にはなにがあるのでしょうか。 ご教授おねがいします。
- ベストアンサー
- C・C++・C#
- mallocの書式について
初心者です。プログラム上でメモリを確保するmallocという関数がありますが書式がいまいち良くわかりません・・。 戻り値? * malloc(確保する型 * 確保する数) のように書いてますけどmallocの前のはやはり戻り値?そのまえの*は?いまいちわかりません。よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C言語 mallocとfreeについて
mallocとfreeを何度も繰り返していると、メモリがどんどん増えていき、最終的にはプログラムが止まってしまいます。 いくつかのページでメモリ確保を繰り返すとメモリをかなり食ってしまうと書いてありました。 これに対する解決策をご存知の方いらっしゃいましたら教えてください。 よろしくお願いします。
- 締切済み
- C・C++・C#
- 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関数等を自作とかされていますでしょうか? どうぞよろしくお願い致します。
- ベストアンサー
- C・C++・C#
- メモリの開放について
いつもお世話になっております。 メモリ開放のお作法について教えてください。 int* p ; p = (int*)malloc( 100 * sizeof( int ) ) ; ※ p = (int*)malloc( 100 * sizeof( int ) ) ; ※ p = (int*)malloc( 100 * sizeof( int ) ) ; free(p); このような記述をした場合、※の付いている2行でメモリ確保した 領域は開放されるのでしょうか。 (メモリ確保に失敗した場合の処理は省略してます。) よろしくお願いします。
- ベストアンサー
- C・C++・C#
お礼
ご指摘の回答ありがとうございます。