STL MAP에 배열을 담았을 때 해제방법 문의
글쓴이: psy5372 / 작성시간: 수, 2014/12/31 - 12:14오후
서로 다른 자료형의 배열 데이터를 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" 메시지가 출력됩니다.
Forums:


중간에 잘못해서 Map 안에 넣은 배열을 삭제하는
중간에 잘못해서 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의 메모리도 낭비할 수 없는 엠베디드 환경 같은데가 아니라면 이거 정말 시원해요.
댓글 달기