2016-09-27 4 views
0

私はリークをチェックし、新しい/削除をオーバーロードすることによってメモリの消費量(ピークなど)をチェックするためにメモリを追跡したいと思います。オペレータを新規にオーバーロードし、トラックメモリに削除する方法は?

しかし、対応する新しい(ブーストを使って数行のコードを持つ単純なプログラムでさえ)の間に1つのdeleteが呼び出されることがあることに気付きました。別の方法(malloc? )、その削除は後にそれを解放することが幸せです。これは、情報(サイズ)を割り当てで保存する必要があるため、問題につながります。

次のメソッドがオーバーロードされていますが、1つの機能が欠落していますか?またはこれは私のC++コンパイラ/ブーストバージョンのバグですか?

void * operator new(size_t size); 
void * operator new(size_t size, const std::nothrow_t&) noexcept; 
void * operator new[](size_t size); 
void * operator new[](size_t size, const std::nothrow_t&) noexcept; 

void operator delete(void* ptr); 
void operator delete[](void* ptr); 
void operator delete(void* ptr, const std::nothrow_t&) noexcept; 
void operator delete[](void* ptr, const std::nothrow_t&) noexcept; 

私は「コード」解決策ではなく、特定のツール・ソリューションを使用することを好むので、私はまた、これは私がプログラムを実行できるようになります、(「valgrindのは使用できません)窓やmingwの-W64のgccのもとで実行していますほとんど普通です

答えて

1

マイクロソフトの標準ライブラリでは、オペレータを経由するのではなく、内部割り当て関数を直接使用することがあります。あなたが見ている問題の種類。

可能ですビジュアルリークディテクタが行うのと同じ方法でコード内で動作させることができますが、興味深いケースがありません。

しかし、最近私はWine wikiにはpage listing a couple of alternatives to valgrindがあることに気付きました。そこから私はDr.Memoryを試しました。これは基本的にvalgrind memcheckツールと同等で、Windows上のcharmのように動作します。

また、通常のデバッグビルドをビルドしてツールで実行するだけで、ツールを使用する方がずっと簡単です。割り当てを無効にしようとするリークディテクタは、非常に複雑です。

+0

私は以前もDrMemoryを使用していましたが、これは良いツールですが、実際にはプログラム中のメモリ割り当てを追跡したかった非常に遅く削除され、リークのように見えます)、またmingw-w64によるデバッグでのリンクはウィンドウ上では非常に遅いです。 – Renaud

+0

@Renaud、問題は、Windowsのオブジェクトフォーマットがシンボルの上書きを本当にサポートしていないことと、Microsoftのランタイムはそれが喜んでいることです.Mingwにとっては、MicrosoftとC++のCランタイムのみを使用するほど悪くないはずですランタイム。 GNU LibCを使っているターゲットでは、GNU LibCにはアロケータを置き換えるためのフックがあるので、それはすべて簡単です。しかし、Windowsはそれをサポートしていません。 –

1

博士メモリーが優れており、

http://www.drmemory.org/

それは楽器にコードを必要としない無料で、コードはそれなしと同じ性能にほとんど保持します。私は何度も漏れを見つけて修正するためにそれを使用しました

関連する問題