CString을 char* 로 형변환하는데 (LPSTR)(LPCSTR) 을 종종 사용한다.
그러나 이를 사용하는 도중 문제점이 발생...
CString 객체 2개를 생성하고 각각 문자열을 읽기 위해 (LPSTR)(LPCSTR) 를 이용한 형변환을 해서 넘겨 주었다.
CString a, b;
fread((LPSTR)(LPCSTR)a , sizeof(char) * len, 1, fp);
fread((LPSTR)(LPCSTR)b , sizeof(char) * len, 1, fp);
허나 황당하게도 a, b 는 서로 레퍼런스 상태가 되어버렸다.
a 값이 바뀌면 b 값도 바뀌고 b 값이 바뀌면 a 값까지 바뀌는 황당한 상태가 되버리는...
그 이유는...
황당하게도 CString은 data를 저장하는 곳을 서로 공유하는(즉 주소값이 같다) reference counting(shared data) 속성이기 때문이다.
CString 내부에는 m_pszData 라는 char* 형의 맴버 변수가 있는데 (LPSTR)(LPCSTR)는 이곳 값이 넘어가게 된다. 이 m_pszData 는 CString 객체 초기화 후 서로 동일한 주소값을 가지고 있다. 그래서 저런 형변환은 두 객체가 동일한 주소값을 넘겨주는 것이 되어버린다.
a = "abc";
b = "def";
이와 같은 경우 m_pszData 는 단순히 자료가 들어있는 곳의 주소값을 저장하는게 아니라 자료가 들어있는 메모리를 임의 위치에 복사하고 그 위치의 값을 갖는 형태가 되므로 두 객체는 서로 별개가 되는 것이다.
즉 (LPSTR)(LPCSTR) 형변환을 이용하여 CString 객체의 m_pszData 를 직접 넘겨주는 건 주의!!
'Programming > MFC' 카테고리의 다른 글
LINK : warning LNK4089: all references to "SHELL32.dll" discarded by /OPT:REF ? (0) | 2006.05.26 |
---|---|
CString 의 상호 형변환 (0) | 2006.05.25 |
실행 파일의 디렉토리 및 파일명 알아오기 (0) | 2006.05.25 |
컨트롤의 Font 만들기 (0) | 2006.05.23 |
윈도우 중앙에 띄우기 (0) | 2006.05.20 |