如何优雅的写UI——(6)内存泄漏
控件讲了这么久,其实我的程序有两个Bug不知道大家有没有发现,这两个Bug都不会报错,对程序运行来说都没有阻碍,但是这种Bug对整个代码来说是一个很大的安全隐患。
什么是内存泄漏
内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
简单的说就是new完之后没有delete。当然,内存泄漏还不止这一点点。但是对于新手来说,大部分的内存泄漏都是因为new的原因 照成的。
内存泄漏对程序的影响?
内存泄漏是造成应用程序OOM的主要原因之一。我们知道Android系统为每个应用程序分配的内存是有限的,而当一个应用中产生的内存泄漏比较多时,这就难免会导致应用所需要的内存超过系统分配的内存限额,这就造成了内存溢出从而导致应用Crash。
首先来看看消息溢出的报错,分为两种,先来

首先来看看前六个内存泄露,其实他们就是属于最常见的内存泄漏,我在new完窗口后没有将窗口释放掉

那么这类问题很好解决,首先三个是成员函数,所以我们只要在析构中delete这三个对象就可以了。
CtabView::~CtabView()
{
if(m_dlg1)
{
delete m_dlg1;
m_dlg1 = NULL;
} if(m_dlg2)
{
delete m_dlg2;
m_dlg2 = NULL;
} if(m_dlg3)
{
delete m_dlg3;
m_dlg3 = NULL;
}
}

下面这个内存泄漏比较麻烦,没法一眼看出来原因,所以我们一点一点来分析
检查定位泄漏的内存块
首先教大家如何定位泄漏的内存块。在我们觉得有内存泄露的地方添加函数,参数是内存块,根据上面的图显示内存块为373;
_CrtSetBreakAlloc(373)
如果_Crt
SetBreakAlloc函数检测到内存泄露,例如我放在创建选项卡上方。他会中断报错,并跳进这里,这就说明程序在这里还是有问题的,咱们得继续往下找

如果说,我把函数放在OnCreat下面,那么这个程序调试就没有问题

通过这样检测内存块,我们可以判断出是OnCreat这里发生了内存泄露,但是OnCreat是微软的API函数,我也没有动态调用,为何会出现内存溢出呢?
再仔细看一下报错信息
Detected memory leaks!
Dumping objects ->
{} client block at 0x05903290, subtype c0, bytes long.
a CMFCVisualManager object at $, bytes long
Object dump complete.
他提到了CMFCVisualManager 这个类,那么有可能这个泄露是跟这个类有关,上网上搜了一下,原理是原因在于VS2008中MFC程序中的应用程序类都派生自CWinAppEx,VS 2008的程序里有一个CMFCVisualManager类的全局对象,负责管理可视化界面,具体来说就是一个单件(设计模式中的单件模式),CWinAppEx类的ExitInstance函数可以析构这个对象。但是以往的MFC程序的应用程序类都派生自CWinApp,因为需要在ExitInstance函数手动这个类对象,具体就是在应用程序类的ExitInstance函数添加代码。
简单的来说CWinAppEx::ExitInstance()函数自动对工程中所采用的CMFCVisualManager对象(如CMFCPropertyGridCtrl、CVCVSListBox等控件)释放资源,而CWinApp::ExitInstance()没有这个能力,因此需要重写。所以这个泄露大致有两种解决方案。
1.CWinApp::ExitInstance()没有释放能力,所以所以我们需要手动释放
在ExitInstance()添加代码
CMFCVisualManager::DestroyInstance( TRUE );
2.ExitInstance()的自动释放能力是基于CWinAppEx类的,所以我们只需要将CxxxApp的父类改为CWinAppEx就可以,同时CWinAppEx是自动实现ExitInstance()方法的,所以将代码自动生成的ExitInstance()方法注释掉就好。


退出后没有任何一处

另外我还发现项目本身还带一些小Bug,比如点到第三页直接跳出来关闭菜单,第二页和第三页颜色不知道为什么会变得一样,这个需要慢慢解决
如何优雅的写UI——(6)内存泄漏的更多相关文章
- 写出js内存泄漏的问题?
回答一: (1)IE7/8 DOM对象或者Active对象循环引用导致内存泄漏 a.多个对象循环引用 b.循环的DOM泄漏 (2)基础的DOM泄漏 当原有的DOM被移除时,子节点引用没有被移除则无法回 ...
- 如何优雅的写UI——(5)选项卡功能实现
先在我们的选项卡可以说能用了,每个标签页都能点进去,但是这还远远没到能用的地步,比如说你把窗口最大化后. 立马就露出马脚了,所以这篇我们要先讲讲tabctrl的最基本的功能实现 改变选项卡大小 上图的 ...
- 如何优雅的写UI——(4)选项卡美化
现在做出来的选项卡实在太丑的,咱们怎么把他弄得好看一点呢 tabctrl是可以添加icon图标的,那派生与tabctrl的mfctabctrl肯定也能添加图标,他们两个添加图标的原理一样,但是还是有点 ...
- 如何优雅的写UI——(3)添加MFC选项卡
窗体创建完成,接下来我们讲讲控件的使用 首先在CFormView窗体下选项卡的成员变量,这里我选择MFC下的选项卡类库:CMFCTabCtrl class CtabView : public CFor ...
- 如何优雅的写UI——(1)MFC六大核心机制-程序初始化
很多做软件开发的人都有一种对事情刨根问底的精神,例如我们一直在用的MFC,很方便,不用学太多原理性的知识就可以做出各种窗口程序,但喜欢钻研的朋友肯定想知道,到底微软帮我们做了些什么,让我们在它的框架下 ...
- 如何优雅的写UI——(2)MFC下基于CFormView的文档视图程序
在MFC中可以创建多种类型的窗口程序,如对话框程序.单文档结构程序(非文档/视图结构).单文档(文档/视图结构)以及多文档视图结构程序等. 在编写一般的小工具时,我们的首选显然是对话框程序,不过基于对 ...
- AndroidStudio 内存泄漏分析 Memory Monitor
ok.写一段内存泄漏的code private TextView txt; @Override protected void onCreate(Bundle savedInstanceState) { ...
- Go 切片的一种有趣内存泄漏方式
今天我在看 Prashant Varanasi 的 Go 发布会演讲:使用火焰图进行生产分析(Analyzing production using Flamegraphs),在演讲开始的第 28 分钟 ...
- AutoDispose代替RxLifecycle优雅的解决RxJava内存泄漏问题
使用过Rxjava的小伙伴都知道,在使用RxJava时如果处理不当,很可能会产生内存泄漏的问题. 我们使用rxjava最大的原因是响应式编程使我们的异步操作代码变得很优雅,在Android中,也使线程 ...
随机推荐
- 杀死超过5min闲置的终端
#!/bin/bash #杀死超过5min闲置的终端 while [ 1 -lt 2 ] do sleep 30 for i in `w -sh | grep ":" | awk ...
- Watcher详解 工作机制, Watcher客户端注册、Watcher 服务端注册
Watcher详解.接口 在 ZooKeeper 中, 接口类 Watcher 用于表示一个标注你的事件处理器,其定义了事件通知相关的逻辑,包含 KeeperState 和 EventType 两个枚 ...
- Java 中的事件监听机制
看项目代码时遇到了好多事件监听机制相关的代码.现学习一下: java事件机制包含三个部分:事件.事件监听器.事件源. 1.事件:继承自java.util.EventObject类,开发人员自己定义. ...
- Servlet深入学习,规范,理解和实现(中)——深入理解Tomcat(一)
心得:在写这篇博客之前.我大致阅读一些关于Tomcat的书籍和博客等资料.有些资料由于时间的关系,解说的Tomcat版本号太老.有些资料能够非常好的说明Tomcat整理结构和设计思想可是非常多重要的问 ...
- Metasploit - Tips for Evading Anti-Virus
绕过杀毒软件,有很多钟方法.此处介绍一种,编写python程序调用shellcode,并使用Pyinstaler将python程序编译为exe程序. 准备工作:(Windows XP环境下编译) 将P ...
- 最全Pycharm教程(10)——Pycharm调试器总篇
最全Pycharm教程(1)--定制外观 最全Pycharm教程(2)--代码风格 最全Pycharm教程(3)--代码的调试.执行 最全Pycharm教程(4)--有关Python解释器的相关配置 ...
- 关于android studio几种常见的错误解决
我也是从ec转到as的,没办法,大势所趋嘛,然而,在使用as的过程中遇到了非常多匪夷所思的错误,如今就说一下今天我遇到的这个错误. 美工妹子给了我一张图片,用来当做button的背景图,当然,这个图也 ...
- 学习中 常用到的string内置对象方法的总结
//concat() – 将两个或多个字符的文本组合起来,返回一个新的字符串. var str = "Hello"; var out = str.concat(" Wor ...
- leetcode 10 Regular Expression Matching(简单正则表达式匹配)
最近代码写的少了,而leetcode一直想做一个python,c/c++解题报告的专题,c/c++一直是我非常喜欢的,c语言编程练习的重要性体现在linux内核编程以及一些大公司算法上机的要求,pyt ...
- Python(四) 分支、循环、条件与枚举
一.什么是表达式 表达式(Expression)是运算符(operator)和操作数(operand)所构成的序列 二.表达式的优先级 三.表达式优先级练习 优先级同级 从左往右计算 1 or 2 a ...