之所以讲是奇异的crash,是因为我开发这么长时间还是第一次遇到这样类型的crash,开始的时候怀疑是由于在DLL中分配的内存在其它的dll中释放导致的,或者由于DLL已经卸载导致分配的内存不可用导致的,然后,经过实验,居然不是,这下可让我没了头脑。
经过仔细分析发现,是因为在dll中分配了一个对象指针,该对象的内存区域还是可用的,但是dll已经卸载,导致该对象的代码区域已经卸载,从而无法正确的访问析构函数导致的访问错误。
参考了 MSDN的技术文章http://www.microsoft.com/china/MSDN/library/netFramework/netframework/0501ExceptLog.mspx?mfr=true重要得以解决。找到了问题的原因,解决起来就容易了,加上try/catch丢弃掉那部分已经不存在代码了的内存。
解决的代码如下:
RctEventInfo oEvent; RctEventInfo& tEvent = m_vEvents.front(); try { oEvent = tEvent; } catch (...) { IRctEventParam** pParam = &oEvent.RctParamPtr; (*pParam) = NULL; pParam = &tEvent.RctParamPtr; (*pParam) = NULL; m_vEvents.pop_front(); m_oLock.UnLock(); return TRUE; }
注:我使用了智能指针,智能指针指向的对象代码已经不复存在导致的这个问题, 当然,我这里采用的 IRctEventParam** pParam = &oEvent.RctParamPtr; (*pParam) = NULL;赋值方法将导致内存泄露……
=========================================欢迎访问装修DIY必备--有房网=========================================