之所以讲是奇异的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必备--有房网
=========================================
本文探讨了一种罕见的程序崩溃原因,即DLL卸载后导致的对象代码区域丢失问题。作者通过实验排除了常见的内存管理错误,并最终定位到DLL卸载导致的问题所在。文中还分享了解决方案,包括使用try/catch来处理已不存在的代码区域。
2832

被折叠的 条评论
为什么被折叠?



