2011-08-04 8 views
2

私はC + +プロジェクトを使用して、多くのメモリを食べている.netプロジェクトを持っています。"新しい"と "削除"バイトをカウントする

削除演算子で解放された新規および流出バイトによって割り当てられた流入バイトを素早く簡単にカウントする方法があるのだろうかと思います。いくつかのログや何かを追加してください。

両方の演算子のソースコードはVisual Studioによって提供されるので、私はそれをハックすることができます。

問題は、私は膨大なVM消費を見ることができ、なぜそれを調べたいのですか?私はいくつかのメモリプロファイラを試みたが、それらのどれも通常Valgrnidまたは合理Purifyののようなメモリプロファイリングツールを使用すると、プログラムのメモリ使用率をプロファイリングすることができます.NETアプリケーション

+0

あなたのプラットフォームについてはわかりませんが、多くのプラットフォームではメモリリークを監視するために[DTrace](http://hub.opensolaris.org/bin/view/Community+Group+dtrace/WebHome)を使用することができます。 –

答えて

4

以内に管理されていないC++の割り当てを扱うことはできません。あなたはまだ独自の実装を持つようにしたい場合は


あなたがそれらをオーバーロードすることにより、グローバルnewdelete演算子を置き換えることができますし、独自のオーバーロードされた演算子の内側にあなたが割り当てられたメモリのカウントを維持することができます。

2番目のオプションに従うように強制された場合、いくつかの面があります。この回答の詳細はhereです。

あなたはSTLを使用している場合:
を順番にSTLコンテナクラスが割り当てのグローバルnew & delete演算子を使用します。したがって、new & deleteグローバル演算子を置き換えると、STLはstd new演算子とdelete演算子の代わりにそれらを使用します。

+0

+1ですが、いくつかのクラスは 'operator new'をオーバーロードしています。これらのクラスに対しても同様の処理を行う必要があります。 – sharptooth

+0

Als、Rational Purifyでは、.NETアプリケーションの管理されていない割り当てはカウントされません。それは同様にC + +のプロファイリングを提供していますが、私のアプリはMemoryViolationExceptionでそのモードでクラッシュするので、かなり役に立たない。また、何かが明確ではない。私のサードパーティライブラリはSTLを使用しています。 STLコンテナは新しいものを呼び出し、どこかで削除します。どこにオペレータをオーバーロードすべきですか? –

+1

@Captain Comic:疑問に答えるために答えを更新しました。それを行う方法については、リンクを参照してください。 –

1

windbgで添付して、!heap -sコマンドを使用して調査を開始できます。

関連する問題