0

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

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(),所以不确定问题出在哪里。

4

1 回答 1

0

该方法本身不会复制数组,并且不太可能是原因(尽管在我看来并不安全,因为它不能保护您免受其他意外错误的影响)。

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

GetFlagsOfRun(..., flags) {
  FlagData& a = ...
  CString b = (LPCTSTR) a.Name; // Not a.Name directly!
  ...
}
于 2012-12-11T09:04:32.373 回答