2011-08-19 2 views
1
typedef ATL::CSimpleMap<WTL::CString,WTL::CString> _Map; 
ATL::CSimpleArray<_Map> g_arrMaps; 
_Map map; 
map.Add(WTL::CString(L"first"),WTL::CString(L"second")); 
map.Add(WTL::CString(L"first2"),WTL::CString(L"second2")); 
g_arrMaps.Add(map); 

//another place _Map has been destructed 
for(int i=0;i<g_arrMaps.GetSize();i++){ 
    _Map m=g_arrMaps[i]; 
    for(int y=0;y<m.GetSize();y++){ 
     ATLTRACE(m.GetKeyAt(y)); //error 
    } 
} 

데이터를 추적 할 때 오류가 발생했습니다.CString, CSimpleMap 및 CSimpleArray를 결합하는 방법

+0

컴파일러 오류가 발생합니까? 내가하지 희망. ATLTRACE를 직접 호출하지 않고 반환 된 값을 WTL :: CString에 저장하고 작동하는지 확인하십시오. – Ajay

+0

어떤 오류가 발생합니까? –

답변

1

CSimpleMap에는 포인터를 내부 버퍼에 복사하는 것만으로도 쓸모없는 컴파일러 제공 복사본 생성자가 있습니다. CSimpleArray에지도를 추가하면 두지도가 실제로 동일한 데이터 구조를 공유합니다. 범위를 벗어나 메모리를 해제하면 다른 하나가 유효하지 않게됩니다. 귀하의 경우, 당신은 이미 해제 된 CSimpleMap 버퍼를 액세스 할 수있는 운이 좋겠지 만 그 버퍼는 CString을 포함하고 일단 삭제되면 내부 버퍼, 즉 char 배열을 삭제합니다.

당신이 할 수있는 일 :

  1. 피가 CSimpleMap를 사용하여. 실제로는 직렬 검색을 수행하며 그 끔찍한 기본 복사본 생성자가 있습니다. 대신에 CAtlMap을 사용하십시오 - 복사 생성자는 private이므로 컴파일 타임에 잘못된 일을하고 있음을 알 수 있습니다.
  2. 지도에 대한 포인터가 포함 된 CSimpleArray이 있습니까 : CSimpleArray<_Map*> 이는 사용자의 추가 메모리 관리를 의미하지만 버퍼 공유를 피할 수 있습니다.
  3. CSimpleMap 또는 CAtlMap을 상속하고 괜찮은 복사본 생성자를 제공 할 수 있습니다.
0

단순한 ATL 컬렉션과 함께 중요하지 않은 복사본 생성자가있는 형식은 사용할 수 없습니다. 이러한 컬렉션은 calloc/_recalloc을 사용하여 메모리를 관리하므로 요소를 제대로 복사하지 않아도됩니다.