가변형의 메모리 구조를 이용하기 위해 C++의 STL을 처음 사용해 보는 과정에서

Visual Studio 6.0에서는 STL이 문제가 많다는 것을 알게 되었다.

혹자는 자신의 블로그에서 VS6.0에서 STL을 사용하는 사람은 도시락을 싸가지고 다니며 말리고 싶다고 할정도...

VS 2005 이후로 STL이 안정화 되었다고는 하나 테스트 해보지는 않았다.

결정적 이유는 이미 코드가 너무 거대해져 버린것..-_-;;

거기다 뽀대좀 내보겠다고 사용한 상용 GUI 라이브러리 부터 시작해서 XML parser에 이르기 까지

VS2005 이후 버전에 호환되지 않는다는 문제가 섣부른 버전 업그레이드를 망설이게 했다.

그렇다고 STL을 포기하자니, 중요한 알고리즘부를 몽땅 들어내야 하는 더 큰 문제가 있었다.

초기에 leak 체크를 하지 않고 좋다구나 하고 코딩한 죄다....T_T

그리하여 '어차피 코드, 인간이 만든 구조물에 해결 방법이 없는 것은 없다!' 라는 일념으로 웹을 뒤지고

이리저리 테스트를 통해 leak을 해결할 방법을 찾은 듯하다.

그래서 VS6.0에서 STL을 사용하는데 주의점을 기록해 두고자 한다.

 

1. Leak의 원인이 되는 clear() 의 오동작

STL의 메모리 해제를 위해 제공되는 함수가 clear()함수인데 이것이 제대로 기능을 하지 않는 듯하다.

여러 자료에서 새로운 instance를 생성하고 이것과 swap하는 방법을 추천하는데, vector에는 이것이

잘 동작하지만, map에는 잘 동작하지 않는다.

그리하여 찾아 낸것이 새로운 instance를 반드시 NULL로 초기화 해주고 이것과 swap을 해야 한다는

것이다.

예를 들어 vector<int> vTest과 map<int,float> mTest가 있을 때

반드시 vTest.swap(vector<int>(NULL)) 과 mTest.swap(map<int,float>(NULL,NULL)) 과 같은식으로

메모리를 해제해 주어야 leak이 발생하지 않는다.

2. Hash map의 iterator

Userdefined type의 object를 map에서 사용할 때에는 iterator를 사용하기 위해서는 instance간에

크기 비교가 가능하도록 method를 만들어 주어야 한다.

예를 들어 map<CTransKey,float>에서 CTransKey에는 operator<가 반드시 정의되어야 한다.

class CTransKey
{
public:
CTransKey();
CTransKey(CState& s0,CAction& a0,CState& s1);
CTransKey(const char* s0, const char* a0,const char* s1);
virtual ~CTransKey();

bool operator==(const CTransKey& k);
friend bool operator< (const CTransKey& k1,const CTransKey& k2);

CState CurState;
CAction CurAction;
CState NextState;

};

bool operator< (const CTransKey& k1,const CTransKey& k2);

 

하기 블로그에서 발췌하였습니다.

[출처] VC 6.0 stl...|작성자 타미

 

 

'프로그래밍 > VC++ 개발 코딩' 카테고리의 다른 글

Raw Sockets  (0) 2014.01.17
fopen 사용방법  (0) 2014.01.17
Registry Write  (0) 2014.01.17
Window Message 함수 설명 - MSDN  (0) 2014.01.17
TerminateThread 사용하는 경우 메모리 증가 처리방안  (0) 2014.01.17

+ Recent posts