STL MAP에 배열을 담았을 때 해제방법 문의

psy5372의 이미지

서로 다른 자료형의 배열 데이터를 map에 쌓아서 버퍼처럼 사용하는 데요.

Class가 소멸될 때 잘못된 메모리 접근 오류가 나는 것 같아서 문의 드립니다.

소스를 간략하게 하면 아래와 같습니다.

Class CConvertData {
 
protected:
     std::map<int, void*> m_ConvertDataCache;
 
public:
     CConvertData()
     {
     }
 
     ~CConvertData()
     {
         for(std::map<int, void*>::iterator it = this->m_ConvertDataCache.begin(); it != this->m_ConvertDataCache.end(); ++it)
	{
		if(it->first == 0)
		{
			delete [] (double*)it->second;
		}
		else
		{
			switch(this->GetItemDataType(it->first))  // 데이터 타입을 가져 옮.
			{
				case ConvDataType_CHAR:
					delete [] (char*)it->second;
					break;
				case ConvDataType_BYTE:
				case ConvDataType_UCHAR:
				case ConvDataType_BOOL:
					delete [] (unsigned char*)it->second;
					break;
				case ConvDataType_SHORT:
					delete [] (short*)it->second;
					break;
				case ConvDataType_WORD:
				case ConvDataType_USHORT:
					delete [] (unsigned short*)it->second;
					break;
				case ConvDataType_LONG:
					delete [] (long*)it->second;
					break;
				case ConvDataType_INT:
					delete [] (int*)it->second;
					break;
				case ConvDataType_ULONG:
					delete [] (unsigned long*)it->second;
					break;
				case ConvDataType_UINT:
					delete [] (unsigned int*)it->second;
					break;
				case ConvDataType_FLOAT:
					delete [] (float*)it->second;
					break;
				case ConvDataType_REAL:
					delete [] (double*)it->second;
					break;
				default:
					break;
			}
		}
	}
     }
 
     template <typename T>
     void SaveItemDatas(int nSignalIdx, T* pSignalDatas)
     {
        this->m_ConvertDataCache[nSignalIdx] = pSiganlDatas;
     }
};

Class가 소멸될 때 "invalid address or address of corrupt block passed to dlfree" 메시지가 출력됩니다.

psy5372의 이미지

중간에 잘못해서 Map 안에 넣은 배열을 삭제하는 구문이 있었네요...ㅡㅡ;

익명 사용자의 이미지

이건 어떠세요? C++엔 C++입니다.

typedef CharVectorMap std::map>;
typedef IntVectorMap std::map>;

CharVectorMap map;
char *p = (어떤 데이터)
size_t s = (크기)

// 버퍼 매핑
map.insert(0, std::vector(p, p + s));
// 백터 접근
map[0].data();

C++에 들어와서는 포인터를 직접 쓰는 방법을 회피할 수 있습니다. 컨테이너 내에 또 다른 컨테이너를 담고 그 참조를 계속 사용하면 segfault를 낼 확률도 적구요.
CRT에서는 스마트 포인터라는 게 있기도 합니다.

결국 new 연산자는 인스턴스화에만 사용하게 될 수도 있습니다. 정말 1M의 메모리도 낭비할 수 없는 엠베디드 환경 같은데가 아니라면 이거 정말 시원해요.