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의 메모리도 낭비할 수 없는 엠베디드 환경 같은데가 아니라면 이거 정말 시원해요.
댓글 달기