Visual c++ CSimpleArray在RemoveAll崩溃

Visual c++ CSimpleArray在RemoveAll崩溃,visual-c++,atl,heap-memory,Visual C++,Atl,Heap Memory,我有一个EXE,它调用DLL中的一个方法 DLL中的方法定义为,其中CSimpleArray是ATL类: class DriverUtility { .... virtual bool GetFlagsOfRun(int runID, CSimpleArray<FlagData> &flags) = 0; }; struct FlagData { CString Name; CString Value; CString TypeNam

我有一个EXE,它调用DLL中的一个方法

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

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

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

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

该方法本身不复制数组,也不太可能是原因(尽管在我看来并不安全,因为它不能保护您避免发生其他意外错误)

我想说的是,您可能正在从数组元素中传递的结构复制字符串,最终您会与DLL和EXE模块的字符串分配器发生冲突,从而导致访问冲突。确保调用者没有复制该字符串,如果需要复制,请执行以下操作:

GetFlagsOfRun(..., flags) {
  FlagData& a = ...
  CString b = (LPCTSTR) a.Name; // Not a.Name directly!
  ...
}
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;
}
GetFlagsOfRun(..., flags) {
  FlagData& a = ...
  CString b = (LPCTSTR) a.Name; // Not a.Name directly!
  ...
}