KSvgEditor内存泄漏分析报告
【摘要】 本报告采用VMMap内存分析工具、VLD内存泄露分析工具,对KSvgEditor项目的内存占用情况、内存泄露问题以及内存优化方案进行说明。报告中将对各个分析工具的使用进行说明,分析以降低特定功能的内存使用量、排查内存占用异常上涨为目的,通过中断分析调用栈、记录内存分配比较差异的方法来进行。 【关键词】 内存泄漏、内存优化一、项目内存占比分析
VMMap是对进程所用虚拟、物理内存进行分析的工具,可以统计进程所使用的虚拟、物理内存并以条形图与文字的形式进行呈现。VMMap的过滤和刷新功能可以及时观察进程内存使用的来源以及占用情况。 运行KSvgEditor项目,并使用VMMap工具进行检测,可首先观察到如下界面。二、项目内存泄露点
Visual Leak Detector,它是一款用于 Visual C++免费的内存检测工具。VLD可以得到内存泄漏点的调用堆栈、泄露内存的完整数据,还可以设置内存泄露报告的级别。在VS项目中,加上项目编写过程中遇到的泄漏点:
1.单例释放
原因分析:单例模式可用嵌套类对内存进行释放;
释放类的对象不能作为普通成员函数,如果作为普通成员函数,单例指针无法进行释放,释放类对象和单例指针作为同一个类的成员,由于在同样的作用域下,Singleton和AutoRelease的析构函数形成死锁(这种情况下,Release类对象的释放要Singleton的析构函数执行才能销毁,而Singleton的销毁又需要Release的析构函数执行才能完成)。 因此,释放类的对象不能和单例指针在同一作用域下,而作为静态变量,程序执行结束后,释放类对象被销毁,其析构函数被调用,单例类才能被销毁。
- Shapelist释放:
原因分析:Qlist内部存储new的图形信息,不能直接去delete,要先delete QList内部的每一项。