私は、基本的にはディレクトリやファイルの大きなセットに関する情報を解析して保存するプロジェクトに取り掛かり、新たに追加されたファイルの数の要約を示します'ファイルスニファ')。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」でやったよう)
既に使用していない場合は、RAIIとスマートポインタを参照してください。 – ssube
valgrindのようなツールを使用すると、メモリリークが疑われる場合にそれを特定するのに役立ちます。 –
あなたのコードを見て、ヒープ割り当てメモリを解放しない場所を見つけてください。オブジェクトメソッド内にメモリを割り当てる場合、デストラクタでメモリを解放することを忘れないでください。 – mikithskegg