본문 바로가기

Programming/MFC

CString 형변환 (LPSTR)(LPCSTR) 사용 시 주의

출처 My Memo | 쿠기
원문 http://blog.naver.com/inkooki79/120023905137



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 를 직접 넘겨주는 건 주의!!