CSimpleMap
имеет бесполезный конструктор копирования, предоставляемый компилятором, который просто копирует указатель на свой внутренний буфер. Когда вы добавляете карту в CSimpleArray
, обе карты фактически имеют одинаковую структуру данных. Когда один выходит из области видимости и освобождает память, другой также становится недействительным. В вашем случае вам может повезти с доступом к уже освобожденному буферу CSimpleMap
, но этот буфер содержит CString
s, и после удаления они освобождают свои внутренние буферы, а именно массивы символов.
Что вы можете сделать:
- Избегайте использования
CSimpleMap
. Он фактически выполняет последовательный поиск, и у него есть этот ужасный конструктор копирования по умолчанию. Вместо этого используйте CAtlMap - его конструктор копирования является закрытым, так что вы будете знать, что делаете что-то не так во время компиляции.
- *
CSimpleArray
содержит указатели на карты: CSimpleArray<_Map*>
. Это означает дополнительное управление памятью с вашей стороны, но тогда вы избежите совместного использования буфера.
- Или вы можете унаследовать
CSimpleMap
или CAtlMap
и предоставить ему достойный конструктор копирования.