野指针--程序崩溃的炸弹

原创:转载请注明出处 http://hi.csdn.net/redhat7890 

   

          我在EXE应用程序中使用DLL,该DLL包含对话框资源,该对话框是我从别的工程中复制进来的,运行EXE应用程序时对话框窗口正常打开,一切功能皆正常,但是在窗口关闭时出现异常,Debug调试时出现异常中断,查看堆栈发现是DoModal()调用过程中,DestoryWindows()里产生的,我怀疑是资源ID的问题,在我复制对话框资源到我的DLL工程里,并且将相关的ID和成员变量,还有DoDataExchange()函数中DDX_Control()相应的环境值都修改一番,但是事实上我的DLL的resource.h中和EXE的resource.h并没有重复的ID号了,可问题依然存在,这让我很纳闷。在程序中:


           和对话框资源ID相关的就是CDialog的头文件中enum { IDD = IDD_SIGNDIALOG }
           和控件资源ID相关的既是DoDataExchange()函数中DDX_Control()参数啦
           在程序中我也使用了DLL模块切换时的状态保护,AFX_MANAGE_STATE(AfxGetStaticModuleState()),这个异常没道理啊?仍旧纳闷!

 

极度的纳闷让我做了测试,我重新创建了一个解决方案,并且创建寄主EXE,和DLL,但是DLL中的窗口全部由我手工绘制,为了保证ID不和寄主的重复,我将寄主的所有资源全部删除,运行时奇怪的发现就是:异常中断再次了。得到启示:该问题和资源根本没有任何关系!

 

异常中断:Host.exe 中的 0x783745d7 (mfc80ud.dll) 处未处理的异常: 0xC0000005: 读取位置 0xfeeeff56 时发生访问冲突!


           然后我开始怀疑真正的问题应该是寄主程序中,当我继续研究堆栈调用时我发现现在是我的函数全部执行完毕了,因为窗口对象是new出来的,所以窗口对象指针需要Delete,可我已经Delete了,为何堆栈显示的pThread->m_pMainWnd != NULL呢?最后才发现我是在窗口销毁后,也释放了堆上的东西,指针也等NULL了,但是该指针在前期赋值了m_pMainWnd = (CWnd*)dlg;所以m_pMainWnd成了野指针!

---------------------------------------堆栈上-----------------------------------------------------------

  

 

 所有的疑团到这里都云开雾散了,这个花费了我将近5个小时的问题,并且让我极度纳闷的问题竟然来自一个小小的指针!


           到这里问题已经解决,但是给我带来很多思考,在c++程序中像这种因为野指针带来的问题和内存泄露一样属于灾难性的,并非程序一运行我们就能发现的,也许程序完了它都没有发生,但是这样隐型的炸弹,一旦发生我们的应用程序就彻底崩溃!像一直被我爱戴敬佩的Windows的开发商-微软没有关于这些野指针的处理,所以全靠我们程序的实现者来把握!


 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值