2012-12-10 2 views
0

DLL의 메서드를 호출하는 EXE가 있습니다.CSimpleArray가 RemoveAll에서 충돌했습니다.

CSimpleArray가 ATL 클래스입니다 DLL의 방법으로 정의된다

: 내가 m_mdFlags.RemoveAll를 호출 할 때, 그것은 free(m_aT);에서 충돌

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

로 EXE에서 메서드를 호출

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

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

힙 오류가있는 주소 :

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! 
    ... 
} 
관련 문제