Управление памятью в объектно-ориентированном дизайне с использованием C ++ - PullRequest
2 голосов
/ 14 февраля 2012

Я работаю над проектом, который в основном включает в себя анализ и хранение информации о большом наборе каталогов и файлов и дает мне сводку количества недавно добавленных файлов (больше похоже на «File Sniffer»).

Результатом моей программы является то, что когда я запускаю ее, скажем, около 30 ГБ данных, я вижу, что выделяемая память (рабочий набор) увеличивается до 700 000 К (утечка памяти).

В моем коде я использую довольно много объектов создания и уничтожения. Наиболее используемый объект довольно тяжелый.

Любые предложения о том, что можно сделать, чтобы уменьшить использование памяти. Пожалуйста, дайте мне знать, если что-то неясно.

Основная часть кода выглядит примерно так:

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' в коде)

Ответы [ 2 ]

3 голосов
/ 14 февраля 2012

Утечка памяти, если каталог не существует:

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

dir необходимо удалить перед возвратом (умный указатель упростит управление dir) или просто выделить dir в стеке:

directory dir;
if(!dir.DirectoryExists(path))
    return;
0 голосов
/ 14 февраля 2012

Поскольку вы храните информацию о файлах, а не сами файлы, то больше , сколько файлов состоит из этих 30 ГБ данных.Но в любом случае: маловероятно, что , что много файлов, так что вы, вероятно, правы, что есть утечка памяти.

Существуют инструменты, которые помогут вам обнаружить утечки памяти в вашем коде;некоторые из них стоят больших денег, некоторые бесплатны, всем требуется некоторое время, чтобы потренироваться с ними.

Если вы не пойдете по маршруту инструмента: Чтобы обнаружить, действительно ли есть утечка, вы можете просто запустить свойзапрограммируйте меньшее количество данных, скажем, на 100000 файлов, затем освободите все созданные вами объекты, затем повторите это в цикле и посмотрите, будет ли память увеличиваться или уменьшаться или постоянно увеличиваться.

Если выЕсли вы хотите, чтобы мы нашли утечку в вашем коде, пожалуйста, опубликуйте ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...