0

cまたはc++で、動的に割り当てられたメモリを追跡する方法はありますか。私はこのようなコードを持っていると言います

void somefunction(some arguments,long mc){
//allocate b bytes of memory using malloc,calloc or new
mc += b;


//allocate once again, say p bytes
mc += p;


//deallocate q bytes using delete or free()
mc -= q;

print "mc bytes allocated at this point";

} 

mcをグローバルとして宣言し、すべての関数で使用できます。問題は、メモリの割り当てが解除されたときに、割り当てが解除されたメモリの量を知る方法がないため、この場合、mcをどのように更新するかです。

4

5 に答える 5

3

malloc()、calloc、free() のラッパー関数を作成します。malloc/calloc では、追加のワード サイズを割り当てて、割り当てるメモリ量を維持し、mc で割り当てられたバイト数を合計します。解放するときは、最初のヘッダー バイトを読み取って、解放するメモリの量を確認し、mc から同じサイズを減らします。

于 2013-03-18T18:58:33.293 に答える
1

ラッパーを使用するとオーバーヘッドが発生します。単にデバッグの目的で、malloc/calloc/free/etc をフックして、実行内容に関する情報をダンプすることを好みます。

これの利点は、リリースするとき (デバッグの必要がなくなったとき) にフック機能を削除するだけで済むことです。

于 2013-03-18T19:40:37.237 に答える
0

メモリ リーク検出ツールで示されているように、メモリ割り当てルーチンをインターセプトします。

https://sourceforge.net/projects/diagnostic/ http://diagnostic.sourceforge.net/index.html

(おそらく、アプリケーション内に統合することもできます)。

malloc、realloc、free だけでなく、他のすべての割り当ても取得できます。

ただし、メモリ フックはマルチスレッド環境で実行されることに注意してください。アプリケーションがシングル スレッドであっても、他のスレッドでも多くのことが発生する可能性があります。

十分に保護されていないコードはデッドロックにつながる可能性があります - readme で私のコードの設計を参照してください。

于 2016-11-03T17:51:37.943 に答える
0

long直接行う方法はありません。クラスでラップlongし、MyLongクラスをオーバーロードoperator newします。これにより、ヒープ内のメモリ割り当てが追跡されます。

于 2013-03-18T18:50:51.870 に答える
0

カスタム メモリ アロケータを使用して、メモリ割り当てを追跡できます。参照実装については、Doug Lea のものを参照してください。

于 2013-03-18T18:51:01.537 に答える