由于dll导致的奇异CRASH

    技术2022-05-11  87

    之所以讲是奇异的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必备--有房网=========================================


    最新回复(0)