首页 > 系统相关 >InitInstance中创建CWnd派生的窗口对象,内存泄漏

InitInstance中创建CWnd派生的窗口对象,内存泄漏

时间:2022-12-07 15:32:59浏览次数:45  
标签:InitInstance 窗口 CFrameWnd OnNcDestroy PostNcDestroy 文档 内存 CWnd delete


问题

MFC程序中,在主程序类的InitInstance中创建由CWnd派生的CMyWnd窗口对象,程序关闭时,在vs的输出窗口报告有内存泄漏。

分析

单文档、多文档程序都是在InitInstance中new出主窗口,我也是仿照那个写的。但存在区别,CMyWnd类是从CWnd类派生,而前者是派生自CFrameWnd。

那原因就从CFrameWnd身上找吧,方法:在自动生成的单文档程序的主窗口类的析构函数中下个断点,关闭程序,从函数调用堆栈中即可看出是哪里删除这个主窗口对象的,查找到以下函数:

void CFrameWnd::PostNcDestroy()
{
// default for frame windows is to allocate them on the heap
// the default post-cleanup is to 'delete this'.
// never explicitly call 'delete' on a CFrameWnd, use DestroyWindow instead
delete this;
}

MSDN对PostNcDestroy的说明也证实了这一点:

Called by the default OnNcDestroy member function after the window has been destroyed. Derived classes can use this function for custom cleanup such as the deletion of the this pointer.

解决方案:

首先看下OnNcDestroy的文档说明:

Override PostNcDestroy if you want to perform your own cleanup, such as a delete this operation. If you override OnNcDestroy, you must call OnNcDestroy in your base class to ensure that any memory internally allocated for the window is freed.

这里给出的解决办法,重载虚函数PostNcDestroy去删除本身


标签:InitInstance,窗口,CFrameWnd,OnNcDestroy,PostNcDestroy,文档,内存,CWnd,delete
From: https://blog.51cto.com/u_15905375/5919615

相关文章

  • JVM内存模型
    #JVM内存模型如何分配的##JVM内存模型的划分> 由于我们生产环境使用的虚拟机HotSpot居多,所以下面的描述都是基于HotSpot虚拟机而言的,对于其他类型的虚拟机,如JRockit(O......
  • 如何以时间间隔捕获CPU,procrank,内存和顶级信息?
    我们处理了一些在money或稳定性测试中复制的软件监督问题。根据logcat,内核和跟踪日志分析,SWWD阻塞的线程的回溯不是固定的。在换句话说,阻塞的线程在特定功能中不会被阻塞。......
  • 数组:内存分析及三种初始化
    数组(堆和栈的关系)内存分析:通常我们说的分析java内存,指的是分析java的堆内存(heapmemory),稍微扩展点,还可能涉及到持久带内存(jre7以前)或者Metaspace(jre8以后)。.一般的垃圾......
  • 内存数据簇和数据库数据簇使用实例
    TABLES:SFLIGHT.types:beginofty_sflight,carridtypesflight-carrid,connidtypesflight-connid,fldatetypesflight-fldate,planetypety......
  • 以修改内存的方式实现导入表动态注入
    简介搜索"导入表注入",网上大堆的博客和代码,统统都是修改PE文件实现的.这里将介绍exe加载到内存后,修改主模块映像,而不必去改变本地的exe文件的注入方法.原理注......
  • 034-MemoryStream内存数据读写
    位与字节计算机中最小的单位时“位”,用bit表示,数据是用二进制来表示。但是bit过小,因此用字节来作为存储单位,用“Byte”表示,其中8位组成一个字节。所以一个字节表示的数的......
  • 【深入理解java虚拟机】 - HotSpot虚拟机中对象的创建、内存布局和访问
    文章目录​​对象的创建​​​​对象的内存布局​​​​对象头​​​​实例数据​​​​对齐填充​​​​对象的访问定位​​​​句柄​​​​直接指针​​​​优缺点​​对......
  • JVM内存结构
    JVM内存结构  线程共享的由:堆和方法区线程隔离:虚拟机栈、本地方法栈和程序计数器 堆:  虚拟机栈:......
  • 内存马
    Tomcat-filter内存马参考文章:http://wjlshare.com/archives/1529https://jkme.github.io/2022/04/14/memory-shell-1.html#Listenerhttps://xz.aliyun.com/t/10196h......
  • android开发内存泄漏分析步骤总结
    思路:复现泄漏步骤,dumphprof文件,用MAT工具分析大对象的引用链。操作步骤:1、adbshell进入Android系统2、amdumpheap[进程名]/data/local/tmp/temp.hprof3、另起......