Как объединить CString, CSimpleMap и CSimpleArray - PullRequest
1 голос
/ 19 августа 2011
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
    }
}

Я получил ошибку, когда хочу отследить данные.

Ответы [ 2 ]

1 голос
/ 16 сентября 2011

CSimpleMap имеет бесполезный конструктор копирования, предоставляемый компилятором, который просто копирует указатель на свой внутренний буфер. Когда вы добавляете карту в CSimpleArray, обе карты фактически имеют одинаковую структуру данных. Когда один выходит из области видимости и освобождает память, другой также становится недействительным. В вашем случае вам может повезти с доступом к уже освобожденному буферу CSimpleMap, но этот буфер содержит CString s, и после удаления они освобождают свои внутренние буферы, а именно массивы символов.

Что вы можете сделать:

  1. Избегайте использования CSimpleMap. Он фактически выполняет последовательный поиск, и у него есть этот ужасный конструктор копирования по умолчанию. Вместо этого используйте CAtlMap - его конструктор копирования является закрытым, так что вы будете знать, что делаете что-то не так во время компиляции.
  2. * CSimpleArray содержит указатели на карты: CSimpleArray<_Map*>. Это означает дополнительное управление памятью с вашей стороны, но тогда вы избежите совместного использования буфера.
  3. Или вы можете унаследовать CSimpleMap или CAtlMap и предоставить ему достойный конструктор копирования.
0 голосов
/ 16 сентября 2011

Вы не можете использовать типы, которые имеют нетривиальные конструкторы копирования с простыми коллекциями ATL. Эти коллекции используют calloc / _recalloc для управления своей памятью и не пытаются копировать элементы должным образом.

...