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

mie

 
 
 

日志

 
 

CPropertyPage析构异常  

2010-10-08 15:10:33|  分类: Windows开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

CPropertyPage::~CPropertyPage()
{
 free(m_pPSP);
#ifndef _AFX_NO_OCC_SUPPORT
 Cleanup();
#endif

 if (m_hDialogTemplate != NULL)          //问题出现
  GlobalFree(m_hDialogTemplate);
}

反汇编:

#ifndef _AFX_NO_OCC_SUPPORT
 Cleanup();
78A87D5A  mov         ecx,dword ptr [ebp-10h]
78A87D5D  call        CPropertyPage::Cleanup (78A87DD0h)
#endif

 if (m_hDialogTemplate != NULL)
78A87D62  mov         eax,dword ptr [ebp-10h]
78A87D65  cmp         dword ptr [eax+5Ch],0
78A87D69  je          CPropertyPage::~CPropertyPage+68h (78A87D78h)

 

其中,

78A87D62  mov         eax,dword ptr [ebp-10h]

eax为NULL,向空地址赋值,导致异常!这说明Cleanup调用出错。

 

步调进入Cleanup,
void CPropertyPage::Cleanup()
{
 COccManager* pOccManager = afxOccManager;
 if ((pOccManager != NULL) && (m_pOccDialogInfo != NULL))
 {
  pOccManager->PostCreateDialog(m_pOccDialogInfo);
  free(m_pOccDialogInfo);
  m_pOccDialogInfo = NULL;
 }
}

其中,执行到  pOccManager->PostCreateDialog(m_pOccDialogInfo);时出错。

 

解决!

我重载了CMyOccManager,并定义CMyOccManager m_occ_manager;  调用 AfxEnableControlContainer( &m_occ_manager );  而系统在退出时会自动回收(delete)这个 m_occ_manager,使用回收堆的方法回收栈资源,导致出错。

 

正确的写法如下:

 m_occ_manager=new CMyOccManager;

 ATLASSERT(m_occ_manager!=NULL);

 AfxEnableControlContainer( m_occ_manager );

By:zhanyonhu

  评论这张
 
阅读(601)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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