Visual c++ CSimpleArray在RemoveAll崩溃
我有一个EXE,它调用DLL中的一个方法 DLL中的方法定义为,其中CSimpleArray是ATL类: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
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!
...
}