前段时间在解决代码的内存泄露问题,解决了部分内存泄露问题。

http://blog.csdn.net/enjolras/archive/2011/01/05/6117628.aspx

这篇文章起到了很好的指引作用,让我对MFC里宏观方面的释放有了一定了解。

总结一下就是:

1、推荐用DestroyWindow来销毁窗口(或者从窗口派生的对象)。

2、重载PostNcDestroy函数通过调用基类的PostNcDestroy函数,如:Cwnd::PostNcDestroy,以及通过delete this来调用析构函数(析构函数中处理窗口类中的需要delete的成员)来自动清理。

此外比较重要的几点(需要好好理解的几点):

1、Windows对象(CWnd派生类的对象)既代表一个C++对象(在应用程序的堆中分配)也代表了一个HWND(由窗口管理器在系统资源里分配)。释放分为如下部分,C++对象的释放,HWND的释放,以及C++对象与与之关联的句柄的分离过程(detach)。

2、当销毁一个Windows窗口时,最后发送给此窗口的Windows消息是WM_NCDESTROY。CWnd对此消息的缺省处理(CWnd::OnNcDestroy)会将C++对象与HWND分离,并调用虚函数PostNcDestroy

3、缺省的CWnd析构函数会在m_hWnd不为空的情况下调用DestoryWindow,但这不会导致无穷递归,因为此句柄在清除阶段将会处于分离状态并为空。注意是缺省的,若重载了析构函数将不会调用。

4、CWnd::PostNcDestroy也会在大部分Create调用的执行部分被调用,如果错误发生的话。

5、CWnd::PostNcDestroy的缺省操作是什么也不做,这适合于那些分配在堆栈或者嵌在其他对象里面的窗口对象。这不适合于那些设计来分配在堆上的窗口对象(不嵌在其他C++对象中)。所以重载分配在堆上的窗口对象需要重载PostNcDestroy并在此 函数中delete this,否则析构函数不会被自动调用,而分配在栈上会自动回收,不需要手动释放。

6、对于一个不执行自动清理的对象,在调用DestroyWindow之后,这个C++对象仍然存在,但是m_hWnd会为空。对一个执行自动清理的对象,在调用DestroyWindow之后,此C++对象就不存在了,它被PostNcDestroy的自动清理执行过程里的delete操作符释放。(区别就在于有没有delete this,如果你喜欢,也可以不重载PostNcDestroy,调用pWnd->DestroyWindow再delete pWnd;)。

补充知识点:

1、HWND,窗口句柄。

内核对象的数据结构仅能够从内核模式访问,应用程序必须使用API函数访问内核对象。调用函数创建内核对象时,函数会返回标识此内核对象的句柄。此句柄是一个能够被进程中任何线程使用的一个不透明的值,许多API函数需要以它为参数,以便系统知道要操作哪一个内核对象。

2、引用计数,某些系统资源(内核对象)可为多个进程所有,用引用计数来记录有多少个进程引用了这个资源,如果没有释放会导致引用计数错误,引发系统资源内存泄露。

3、系统资源错误比堆内存泄露有更为严重的后果。

4、所有Handle是Create出来的都需要CloseHandle,窗口句柄不用显式的释放。窗口被销毁的时候窗口句柄就会被释放了。哪些需要哪些不需要请MSDN。

5、DestroyWindow Function说明

--------------------------------------------------------------------------------
The DestroyWindow function destroys the specified window. The function sends WM_DESTROY and WM_NCDESTROY messages to the window to deactivate it and remove the keyboard focus from it. The function also destroys the window's menu, flushes the thread message queue, destroys timers, removes clipboard ownership, and breaks the clipboard viewer chain (if the window is at the top of the viewer chain).

If the specified window is a parent or owner window, DestroyWindow automatically destroys the associated child or owned windows when it destroys the parent or owner window. The function first destroys child or owned windows, and then it destroys the parent or owner window.

DestroyWindow 函数销毁特定的窗口。这个函数发送WM_DESTROY跟WM_NCDESTROY消息去使它失去焦点、移除键盘焦点。这个函数也销毁窗口菜单,清洗消息队列,销毁时间事件,移除剪贴板所有权,和打破剪切板查看链(如果这个窗口在查看链的顶端)。

如果这个特定的窗口是一个父窗口或拥有者象的窗口,DestroyWindow函数自动销毁关联的子窗口或者被拥有窗口,然后再销毁父窗口与拥有者窗口。

以下是VC中一些“特别”的内存地址,指针变量要记得初始化

0xcdcdcdcd - Created but not initialised

0xdddddddd - Deleted

0xfeeefeee - Freed memory set by NT's heap manager

0xcccccccc - Uninitialized locals in VC6 when you compile w/ /GZ

0xabababab - Memory following a block allocated by LocalAlloc()

内存泄露解决记录——窗口资源释放相关推荐

  1. 内存只增不减(非内存泄露)解决

    内存只增不减(非内存泄露)解决 微信公众号:幼儿园的学霸 个人的学习笔记,关于OpenCV,关于机器学习, -.问题或建议,请公众号留言; 在ADAS项目中,代码中加入了跟踪模块,使得程序的内存占用不 ...

  2. 哪些操作会造成内存泄漏及Js内存泄露解决方法

    1.垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量.如果一个对象的 引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的 内存即可回收 2.setTim ...

  3. qt中关闭窗口资源释放问题

    针对QDialog对象,如果是栈上分配的,就不存在资源泄漏问题,但是当对象是new出来的,并且以局部对像存在,当关闭时,窗口只是隐藏,资源是没有释放的,每次exec后者需要delete来释放,另外一种 ...

  4. js垃圾回收机制,内存泄露和内存溢出,解决闭包产生的内存泄露详解

    一.内存的周期和回收机制 分配内存----->使用内存----->释放内存 1.JS 环境中分配的内存有如下声明周期: 内存分配:当我们声明变量.函数.对象的时候,系统会自动为他们分配内存 ...

  5. android手机存储速度慢,安卓内存泄露后台应用被迫关闭、系统速度慢的解决方法...

    安卓内存泄露怎么办?升级到lollipop的android设备用户们有没有遇到后台应用被迫关闭.系统速度慢.经常重启等情况呢?其实这是内存泄露问题,下文小乐哥分享安卓内存泄露解决办法,遇到朋友可以节操 ...

  6. Android内存优化(一)之FinalizerDaemon和FinalizerWatchDog多线程内存泄露案例

    前期有一个内存泄露case跟多线程相关,简单记录如下: 问题描述 跑一晚上的内存测试后,会出现很多的内存泄露,泄露trace如下 In *********:2.0.0:2. * *********** ...

  7. 几种内存泄露检测工具的比较

    概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却 ...

  8. valgrind检测libevent内存泄露

    valgrind检测libevent内存泄露 github地址 在使用封装好的http库时,遇到了如下的内存泄露,一开始在definitely处还存在泄露,这里就不贴图了,已经被淹没了. 根据提示定位 ...

  9. leaks Android内存泄露,Android LeakCanary 检测内存泄露

    内存泄漏: 指程序在申请内存后 ,无法释放已经申请的内存空间,一次内存泄漏可以忽略,但内存泄漏堆积后果很严重,无论多少内存,都会被占光 内存泄露危害: 1.内存泄露最终会导致内存溢出(OOM) 2.导 ...

最新文章

  1. php 插入表,php 向数据库表中插入数据
  2. Meta AI推出“杂食者”:一个模型搞定图像、视频和3D数据三大分类任务,性能还不输独立模型...
  3. 2014年考研计算机大纲解析:数据结构,2014年考研计算机大纲解析之数据结构
  4. 王爽《汇编语言(第三版)》检测点11.1
  5. ACL2020 奇葩论文标题大赏
  6. 机器学习 —— 基础整理(二)朴素贝叶斯分类器;文本分类的方法杂谈
  7. php mysql_fetch_field_PHP mysqli_fetch_field() 函数
  8. layui模板引擎laytpl判断为null或为空
  9. java调用C++代码
  10. 使用STM32CubeProgrammer烧录STM32芯片
  11. Google Indexing API 推送 (避免踩坑)
  12. 心情不美丽,爬了一些美图,独自欣赏!
  13. 小程序完整demo推荐:东航旅行;预订酒店,机票(适用1221)
  14. 一分钟了解矩阵、方阵、对角矩阵、单位矩阵之间的关系
  15. pandas读取带中文的csv
  16. 试题 算法训练 生活大爆炸版石头剪刀布
  17. 【正点原子STM32连载】第六章 新建寄存器版本MDK工程 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
  18. 数据结构和算法之暴力递归到动态规划01-绝顶聪明纸牌问题
  19. 最大数据被盗案是怎么被发现的:从微博被加粉开始
  20. 国内从事红外热成像的公司

热门文章

  1. Cesium第一次搭建环境出不来地球的问题
  2. ts+v3 报错:‘Upload.vue‘ cannot be compiled under ‘--isolatedModules‘ because it is considered a global
  3. 百度图片下载器2.0
  4. JS模块化的前世今生
  5. 做VC?不做VC?创业还是做FA?朋友你到底想做什么?
  6. 中国ABS市场发展前景与投资策略建议报告2022-2028年
  7. php study计算闰年,IOS_IOS获取指定年月的当月天数,前言 在开发IOS中常常需要用 - phpStudy...
  8. com.google.zxing 二维码工具类
  9. 大棚养殖韭菜如何保障产量?资产监测设备保障大棚养殖韭菜
  10. Maekdown使用