使用C ++进行面向对象设计的内存管理

时间:2012-02-14 17:48:07

标签: c++ memory-management memory-leaks

我正在开发一个项目,主要涉及解析和存储大量目录和文件的信息,并给我一个新添加的文件数量的摘要(更像是'文件嗅探器')。

我的程序的结果是,当我运行它说大约30 GB的数据时,我看到分配的内存(工作集)增长到700,000 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')

2 个答案:

答案 0 :(得分:3)

如果目录不存在,则存在内存泄漏:

directory *dir=new directory();
if(!dir->DirectoryExists(path))
    return;
返回之前必须删除

dir(智能指针会简化dir的管理)或只在堆栈上分配dir

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

答案 1 :(得分:0)

由于您要存储有关文件的信息,而不是文件本身,因此它们与那些30 GB数据所包含的多少个文件相关。但无论如何:不太可能存在许多文件,所以你可能正确存在内存泄漏。

有些工具可以帮助您检测代码中的内存泄漏;其中一些花了很多钱,一些是免费的,都需要一些时间来练习它们。

如果您不使用工具路线:要检测是否确实存在泄漏,您可以在少量数据上运行程序,比如100000个文件,然后释放您创建的所有对象,然后重复此操作一个循环,看看内存是否上下或稳定增加。

如果您希望我们帮助您查找代码中的泄漏,请发布您的代码。