2012-02-14 17 views
2

私は、基本的にはディレクトリやファイルの大きなセットに関する情報を解析して保存するプロジェクトに取り掛かり、新たに追加されたファイルの数の要約を示します'ファイルスニファ')。C++を使用したオブジェクト指向設計のメモリ管理

私のプログラムの結果は、30GBのデータを実行すると、割り当てられているメモリ(作業セット)が最大70万K(メモリリーク)になることがわかります。

私のコードでは、かなり多くのオブジェクトの作成と破壊を使用しています。最も使用されるオブジェクトはかなり重いです。

メモリ使用量を減らすために何ができるかを教えてください。不明な点があれば教えてください。

void analyzeHelper(std::string path){ 
    directory *dir=new directory(); 
    if(!dir->DirectoryExists(path)) 
     return; 
    dir->SetCurrentDirectory(path); 
    summary=new Summary();      // Heavy class 
    for(size_t i=0;i<dir->GetDirectories("*.*").size();i++) 
     summary->addChild(dir->GetDirectories("*.*")[i]); 
    for(size_t i=0;i<dir->GetFiles().size();i++) 
     summary->addFile(Path<std::string>::toLower(dir->GetFiles()[i])); 
    summary->setLocation(path); 
    delete dir; 
    compare(); // here I run a comparision of the same directory with its previous version 
    createMetadata(); // create an xml file to store the current version 
    int size=summary->childSize(); 
    std::vector<std::string> _children=summary->getChildren(); 
    delete summary; 
    for(int i=0;i<size;i++) 
    { 
     FileSniffer *f=new FileSniffer(xmlroot); 
     f->setRoot(dirRoot,path,remroot); 
     f->analyzeHelper(_children[i]); 
     delete f; 
    } 

}

関連する質問:それはベクトルのコピーを維持するためにどのように悪いです

コードの主要な部分は、このようなものでしょうか? (私は、コードの「_children」でやったよう)

+0

既に使用していない場合は、RAIIとスマートポインタを参照してください。 – ssube

+0

valgrindのようなツールを使用すると、メモリリークが疑われる場合にそれを特定するのに役立ちます。 –

+0

あなたのコードを見て、ヒープ割り当てメモリを解放しない場所を見つけてください。オブジェクトメソッド内にメモリを割り当てる場合、デストラクタでメモリを解放することを忘れないでください。 – mikithskegg

答えて

3

ディレクトリが存在しない場合は、メモリリークがあります:

directory *dir=new directory(); 
if(!dir->DirectoryExists(path)) 
    return; 

dirが復帰する前に削除された(スマートポインタがdirの管理を簡素化します)か、単にスタック上dirを割り当てなければなりません。

directory dir; 
if(!dir.DirectoryExists(path)) 
    return; 
+0

おかげで男を割り当てる可能性がある場合、我々は、サブ関数に見ることができません! –

+1

@hmjd:スタックに割り当てられたオブジェクトは、それをさらに単純化します。 :) – netcoder

+1

問題ありません。その他の潜在的なリークについてコメントするには、コードの他の部分について詳細が必要です。もちろん、@netcode、oppsは – hmjd

0

、ファイル、ファイルではなく自分自身についての情報を格納しているので、それはは、データのものを30ギガバイトが構成されてファイルをどのように多くののよりreleventです。しかし、どんな場合でも:にはというファイルがたくさんあるので、おそらくメモリリークがあるかもしれません。

コード内のメモリリークを検出するツールがあります。その中にはたくさんのお金がかかっているものもあれば、無料であるものもあれば、練習に時間がかかるものもあります。

ツールルートに行かない場合:実際に漏れがあるかどうかを検出するには、少量のデータでプログラムを実行して100000個のファイルを作成し、作成したすべてのオブジェクトを解放してからこれを繰り返しますループ内でメモリが上下するか、着実に増加するかどうかを確認します。

コード内で漏れを見つけるのを手助けしたい場合は、コードを投稿してください。

+0

で私のソースコードの一部を更新しました。 –

+0

は大丈夫そうですが、彼らは完全にそれを見落とし...何か –

関連する問題