注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

【原】【★★★★★】C++回收未定义数据类型导致的内存泄露  

2011-03-24 20:54:54|  分类: 疑难杂症 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
开发环境:VC 2010

        程序大致结构:
       A.dll调用B.dll的A_F函数,A_F函数分配内存,并创建一个窗口;窗口关闭时,回收之前分配的内存。
       为了安全起见,对于分配的内存区域,我使用了一个全局链表进行管理(可能分配多个内存区域)。窗口关闭时,回收内存,删除链表节点。但是,考虑到函数调用堆栈的问题,下面的这种写法可能不安全:
       CDialogA::OnCancel()
{
     DestroyWindow();
      delete this;
}
       为此,我通过发送消息的方式,在另外一个管理线程里面回收资源。
       又考虑到C运行时库、C++运行时库等问题,所有的内存分配和回收都是在这个dll内部完成的。

      例如:
      A.exe调用B.dll的函数g_AllocMemory()。
LPVOID g_AllocMemory()
{
    return new char[100];
}
        如果回收内存是在 A.exe中,就可能会出问题。具体原因,可以搜索“/MD、MDd 和/MT、MTd”

      问题:
        按照常规思路,这样的处理绝对是100%的稳定和安全了。然而,每当程序回收资源,就是没法回收,程序出现断言错误。断言发生在dbgheap.c的1399行:

        _ASSERTE(pHead->nBlockUse == nBlockUse);

        其中,pHead->nBlockUse为0x00c00004。

        我绞尽脑汁也想不出个所以然来,后来想了想,0x00c00004,就是未知数据类型!

回收资源的代码:delete pdlg;
       —— pdlg 的声明是:P_CDialogB pdlg。怎么会是未知数据类型!如果是未知的,怎么能够编译通过呢?
        P_CDialogB 的定义:
class CDialogB;
typedef CDialogB * P_CDialogB;

       再仔细一想,确实是“未知的数据类型”。“class CDialogB;”只是个类的声明,而不是定义!于是,在delete pdlg;前面加上“#include "DialogB.h"”,问题解决!

      总结:
delete回收指针类型的数据,必须包含数据类型的定义头文件,否则,会调用失败!


By:zhanyonhu
  评论这张
 
阅读(759)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016