一种不易察觉的内存泄露

 

 

电子科技大学
朱宁

---- 最近,笔者用VC++编写一个屏幕保护程序的时候,发现了内存泄露的问题,感到 非常困惑。后来,在参考几个例子的基础上,解决了这个问题。下面让我们分析 其原因和处理方法:

---- 笔者由CWnd派生了一个子类CDrawWnd, 在主程序类的InitInstance()中添加了 如下代码:

m_pMainWnd=new CDrawWnd();
m_pMainWnd- >Create(.....);
return TRUE;

---- 在调试运行通过后,VC++的调试器报告内存泄露。显然,问题只可能出在上面的 第一行代码上。开始我编写上述代码时,也怀疑 new 没有对应的 delete ,将导 致堆内存无法收回,但是,参考VC++5.0的例子 "Hello" ,该程序这部分的代码 与上述无异,也没有其他函数调用delete 回收堆内存,但并不造成内存泄露。 查看VC++的在线帮助,并没有详细的说明,只是说关闭窗口时,自动调用虚函数 PostNCDestory回收m_pMainWnd指向的内存.

---- 于是笔者尝试在主程序类的析构函数中调用 delete m_pMainWnd ,没有效果。显式 调用CWnd::DestoryWindow()也不起作用。参考例子saver, 发现它前面的实现代码 与笔者的完全相同,但是,它在CDrawWnd类中重载了PostNCDestory虚函数,其中 有一行关键的代码:

delete this;

---- 事实上,是它销毁了CDrawWnd对象。

---- 于是立刻修改了我的程序,在主窗口类中重载了PostNCDestory函数,加入以上语 句,立刻解决了内存泄露的问题。

---- 原因终于明白了,原来,如果程序主窗口类是从CFrameWnd继承的,不需要人工 回收类对象占用的内存,象"hello"例子就是这样的程序。但是如果是从Cwnd类 直接继承的主窗口类,就必须考虑这个问题。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
内存泄漏(Memory Leak)指的是程序中已经分配的内存未被释放或者无法释放,导致系统内存的浪费。内存泄漏的结果可能是程序运行减慢甚至系统崩溃等后果。一些常见的内存泄漏情况包括:分配一个内存块并使用其中未经初始化的内容;释放一个内存块,但继续引用其中的内容;子函数中分配的内存空间在主函数出现异常中断时或主函数对子函数返回的信息使用结束时,没有对分配的内存进行释放;程序实现过程中分配的临时内存在程序结束时没有释放临时内存。内存泄漏一般是不可再现的,开发人员不易在程序调试和测试阶段发现,即使花费了很多精力和时间,也无法彻底消除。 空指针(Null)是指针初始化为Null,与未初始化的值不同。当一个指针被初始化为Null时,它指向的是一个无效的地址,也就是没有实际对象的地址。在使用一个空指针时,由于它指向无效的地址,可能会导致程序出错或崩溃。 在编程中,野指针(Wild Pointer)指的是指针指向的地址是随机的、未知的或者无效的。它通常是由于指针未正确初始化或指针指向的对象已经被释放而产生的。当使用野指针时,由于指针指向的地址是不确定的,可能会导致程序运行出错或崩溃。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [空指针 野指针 内存泄漏 内存溢出](https://blog.csdn.net/heneyT/article/details/119681009)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [OC野指针和空指针,僵尸对象和内存泄露](https://blog.csdn.net/weixin_29692653/article/details/117116086)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝈蝈俊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值