2012-12-10 106 views
0

我有一个EXE调用DLL中的方法。CSimpleArray坠毁在RemoveAll

在DLL的方法被定义为,其中CSimpleArray是ATL类:

class DriverUtility 
{ 
    .... 
    virtual bool GetFlagsOfRun(int runID, CSimpleArray<FlagData> &flags) = 0; 
}; 

struct FlagData 
{ 
    CString Name; 
    CString Value; 
    CString TypeName; 
}; 

我调用EXE的方法

CSimpleArray<FlagData> m_mdFlags; 
m_pDriverUtility->GetFlagsOfRun(m_lRunID, m_mdFlags); 

当我打电话m_mdFlags.RemoveAll,它崩溃在free(m_aT);与堆错误在:

void RemoveAll() 
    { 
      if(m_aT != NULL) 
      { 
       for(int i = 0; i < m_nSize; i++) 
         m_aT[i].~T(); 
       free(m_aT); 
       m_aT = NULL; 
      } 
      m_nSize = 0; 
      m_nAllocSize = 0; 
} 

据我所知,当分配内存上堆应该在本地释放。我在调用者(EXE)中创建对象,并从调用者调用RemoveAll(),因此不确定问题出在哪里。

回答

0

该方法本身不会复制数组,并且不太可能是原因(尽管对于我来说这并不安全,因为它不能防止发生其他意外错误)。

我想说,你可能会从数组元素中传递的结构中复制字符串,并最终导致DLL和EXE模块的字符串分配器混乱,导致访问冲突。确保您的来电者不复制该字符串,如果您需要复印,请执行以下操作:

GetFlagsOfRun(..., flags) { 
    FlagData& a = ... 
    CString b = (LPCTSTR) a.Name; // Not a.Name directly! 
    ... 
}