KSvgEditor内存泄漏分析报告
【摘要】 本报告采用VMMap内存分析工具、VLD内存泄露分析工具,对KSvgEditor项目的内存占用情况、内存泄露问题以及内存优化方案进行说明。报告中将对各个分析工具的使用进行说明,分析以降低特定功能的内存使用量、排查内存占用异常上涨为目的,通过中断分析调用栈、记录内存分配比较差异的方法来进行。 【关键词】 内存泄漏、内存优化一、项目内存占比分析
VMMap是对进程所用虚拟、物理内存进行分析的工具,可以统计进程所使用的虚拟、物理内存并以条形图与文字的形式进行呈现。VMMap的过滤和刷新功能可以及时观察进程内存使用的来源以及占用情况。 运行KSvgEditor项目,并使用VMMap工具进行检测,可首先观察到如下界面。 其中顶部为进程基本信息,下部为各类类型空间占用条形图。Committed表示进程向操作系统所申请的需要使用到的虚拟内存大小;Private Bytes表示进程所私用使用的虚拟内存大小;Working Set表示进程目前所使用的物理内存大小。 从图中可知,KFTPClient项目启动后,虚拟内存分配空间大小为66360K,项目所私有使用的虚拟内存空间大小为20940K,进程所实际使用的物理内存空间大小为28404K。 在工具的中部区域,对进程内存总体信息进行了进一步分析 横向表头分别代表总体内存大小、申请内存大小、私有内存大小,总体物理内存带下、私有物理内存大小、共享物理内存大小等类型。纵向表头代表总体、进程自身可执行文件以及包含的所有库、内存映射文件、共享内存、堆区空间、栈区空间等类型。其中new与malloc等分配的空间为堆区域,栈区域空间会主动释放,因此进一步对堆区空间进行分析。二、项目内存泄露点
Visual Leak Detector,它是一款用于 Visual C++免费的内存检测工具。VLD可以得到内存泄漏点的调用堆栈、泄露内存的完整数据,还可以设置内存泄露报告的级别。在VS项目中,加上项目编写过程中遇到的泄漏点:
1.单例释放
原因分析:单例模式可用嵌套类对内存进行释放;
释放类的对象不能作为普通成员函数,如果作为普通成员函数,单例指针无法进行释放,释放类对象和单例指针作为同一个类的成员,由于在同样的作用域下,Singleton和AutoRelease的析构函数形成死锁(这种情况下,Release类对象的释放要Singleton的析构函数执行才能销毁,而Singleton的销毁又需要Release的析构函数执行才能完成)。 因此,释放类的对象不能和单例指针在同一作用域下,而作为静态变量,程序执行结束后,释放类对象被销毁,其析构函数被调用,单例类才能被销毁。
- Shapelist释放:
原因分析:Qlist内部存储new的图形信息,不能直接去delete,要先delete QList内部的每一项。