2017-03-26 6 views
0

デストラクタによってオブジェクトが終了した後に解放されるメモリの量を測定することは可能ですか?リソースが適切に管理されているかどうかを確認しようとしています。例えば、私はLinkedListの実装を書いて、それをテストしてきました:C++でのメモリ測定

int main(int argc, char** argv) { 

//check point for initial memory 
int64_t init = ??? ; 

//next points of measurement 
int64_t point_a, point_b; 

List<int> list; 
list.push_back(5); 

{ 
    List<double> l; 
    l.push_back(-0.12); 
    l.push_back(1.6); 
// ... do something else 
// ................ 
// ................ 
    l.push_back(-4.75); 
    l.push_back(7.8); 
    l.print(); 

    point_a = ??? ;// memory state after operations with list 
}//calling destructor 

point_b = ??? ; // memory state after destruction of the l - object 
std::cout << "Initial memory: " << init 
      << ", memory in scope: " << point_b 
      << ", after destructor: " << (point_b - point_a) << "\n"; 
    return 0; 
}//main(); 

私の質問は以下のとおりです。

  1. それは、これを達成することは可能ですか?
  2. の場合は、???の代わりに何を配置すればよいですか?
  3. より良い方法と異なる方法がありますか?
  4. これはまったく意味がありますか?
+4

「C/C++」という用語の使用を中止してください。 –

+0

質問は** C++ **ですので、タグ付けをやめてください。Cにはデストラクタはありません(C11にはありますが、この種はありません)。 –

+0

@AnttiHaapala C11はどうですか?私は何かを逃したか? – DeiDei

答えて

2

これは可能ですか? はい

「はい」の場合は、どうすればよいでしょうか? ? 下記のいずれかのツールを使用してください。

改善の方法はありますか? はい、下記のValgrindおよびMemWatchを参照してください。

これはまったく意味がありますか? いいえ、あなたのコードに店舗のゴブリングなどのエラーがある場合は、小切手にもエラーが発生する可能性があります。大規模なプロジェクトの場合は、シンプルなメモリ監査プロセスを作成し、漏れを探してログを記録し、余分なメモリを消費するプロセスを再起動することができれば、標準ツールを使用することをお勧めします。メモリリークを検出するための

二つの偉大なツールValgrindMemWatchです。

myprog arg1 arg2 

が続い--leak-checkオプションでvalgrindを使用してメモリリークをチェックし、詳細なメモリをオンにする:

あなたが使用してプログラムを実行した場合、エラーコードを確認するためにvalgrindを使用するには漏れ検出器:あるとして、あなたのコンパイルされたプログラムにそれを実行することができますので、

valgrind --leak-check=yes myprog arg1 arg2 

Valgrindは素晴らしいです。

MemWatchは、他の便利なツールですが、あまり一般的ではありません。あなたはそれについて読むことができますhere。各ファイルに最後のインクルードとして "memwatch.h"を含めることで、コンパイル時にプログラムに組み込む必要があります。

MemWatchがコンパイル時に定義されている場合、メモリリークを追跡できるように、独自のラッパーでメモリを割り当て/解放するシステムコールを置き換えます。コードを実行すると、すべての割り当ての詳細なログが生成され、メモリが適切に解放されなかったというエラーが報告されます。インストラクターが学生にプロジェクトにプロジェクトを組み込むように依頼するクラス割り当てを行っている学生にとっては、本当に良いことです。生徒とTAは、バグリッド出力の解釈方法を習得することなく、これらのチェックを自動的に実行できます。

gcc -o myProg -DMEMWATCH -DMEMWATCH_STDIO MyProg.c memwatch.c 

あなたが有効になってMemWatchを使用してプログラムを実行すると、MemWatchメモリがあるすべての場所を報告します:、MemWatchでプロジェクトをビルドGitHubのからmemwatch.cmemwatch.hhereをダウンロードして、これらのオプションを使用してコンパイルするに

それがログに書き込まれるので、コードを実行した後で見ることができます。コンパイル時にMEMWATCHMEMWATCH_STDIOを定義しないと、MemWatchはコンパイルされたファイルに含まれません。

関連する問題