关于对话框创建过程出现异常的解决方法

昨天,遇见一个怪事,使用CDialog的Create方法创建一个已经做好资源的对话框时,总是出现异常。

CDialog m_Dialog;
m_Dialog.Create(nID,this); // 执行时异常

一直很奇怪找不到问题的原因。上网gogo了一下,说是可能是资源ID的问题。于是自己又重新做了一个资源,再试还是有问题。拿以前没问题的资源尝试,问题还在。

这下可急坏我了,一般情况下vs工具是能够帮助用户发现异常位置,但是通过对话框对象调用Create方法时,这个异常只是提示,但是就是不能定位。


遂开始分析,m_Dialog是一个对象成员,对象成员的地址空间,是在程序静态区,在程序运行之前就已经分配好的空间,通过该空间访问的系统函数都是受保护的,vs工具无法追踪定位,一旦出问题,程序就卡在入口处,连GetLastError()的机会都没有。

想知道异常出现的具体位置,看来需要把这个成员对象,在运行时动态创建在程序堆栈中了。程序堆栈中的调用都会有相应的代码跟踪。

CDialog *m_pDialog;
if (NULL == m_pDialog)
{
     m_pDialog = new CDialog(this);
     m_pDialog->Create(nID,this);
}

再次运行程序,依然是执行Create时异常,但异常很快的定位到一个未进行创建的指针非法使用的地方。修复程序bug,再次运行,一起搞定。


这里主要提示的是,在程序无法定位到具体异常位置时,特别是执行系统函数接口时,最好采用指针对象,虽然指针需要用户维护更多的代码,但是对于查找错误确实帮助不小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值