用C++实现面向对象设计中的内存管理
Memory management in object oriented design using C++
我正在做一个项目,该项目基本上涉及解析和存储关于一大组目录和文件的信息,并为我提供新添加文件数量的摘要(更像"文件嗅探器")。
我的程序的结果是,当我在大约30GB的数据上运行它时,我看到分配的内存(工作集)会增加到700000K(内存泄漏)。
在我的代码中,我使用了相当多的对象创建和销毁。最常用的物体相当重。
关于如何减少内存使用的任何建议。如果有什么不清楚的地方,请告诉我。
代码的主要部分是这样的:
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"一样)
如果目录不存在,就会发生内存泄漏:
directory *dir=new directory();
if(!dir->DirectoryExists(path))
return;
返回之前必须删除dir
(智能指针可以简化dir
的管理),或者只在堆栈上分配dir
:
directory dir;
if(!dir.DirectoryExists(path))
return;
由于您存储的是有关文件的信息,而不是文件本身的信息,因此这与这30 GB的数据包含多少文件有关。但在任何情况下:不太可能有那么多文件,所以你可能是对的,内存泄漏。
有一些工具可以帮助您检测代码中的内存泄漏;有些花了很多钱,有些是免费的,所有这些都需要一些时间来练习。
如果你不走工具路线:为了检测是否确实存在泄漏,你可以在少量数据上运行程序,比如在100000个文件上,然后释放你创建的所有对象,然后循环重复这个过程,看看内存是否会上下波动或稳步增加。
如果您希望我们帮助查找您代码中的漏洞,请发布您的代码。
相关文章:
- 当vector是tje全局变量时,c++中vector的内存管理
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- C++将字符串传递给 C 库以进行内存管理
- 从函数返回时C++内存管理
- 函数指针和 lambda 的内存管理
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- C++中的内存管理
- C和C++中的内存管理有什么区别
- 字符 * 未从重载运算符或内存管理问题正确返回
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 底层指针和内存管理
- 智能指针,避免使用QNetworkAccessManager时进行手动内存管理
- c++中的内存管理问题
- 使用矢量时的内存管理
- 循环和内存管理中的指针算术C++?
- C++堆栈内存管理问题
- C 内存管理中的课程如何管理 - 研究
- 不可变数据模型的内存管理
- C++ 使用数组初始化时的 STL 向量内存管理
- SFML 纹理内存管理