2012-12-10 151 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! 
    ... 
}