CString 올바로 사용하기
출처 : http://blog.naver.com/monsterya/20022662179
음;; 요즘 너무 바쁜데다가.. 잡일? 만 하느라.. 블로그 쓰는일이 뜸했네;;
어쨋거나 꽤 오래전부터 쓰고 싶은 글이 있는데 이 넘의 CString이다.
이 CString이란 녀석은 MFC에서 스트링 사용을 상당히 편하게 해주는데;;;
얼마나 편한가!! += , mid , left, getlength, compare, find 등. 상당히 많은 함수들이 있다.
문제는 이 녀석을 제대로 사용을 하지 않으면 뻐~~~그 를 아주 크리티컬하게 만들어
줄수 있다는 것이다.
일단 이 CString이란 녀석은 CStringObject클래스? 라는 녀석을 사용해서 링크하는 녀석이다.
( MFC internal 에서 본건데;;; 기억이 잘 안난다.. 쩝.. 어쨋든.. 이게 중요한건 아니니
틀렸다고 머라카지 마라~)
이 녀석을 가장 잘못 사용하는 경우가.. 바로 (LPTSTR)(LPCTSTR) 로 타입캐스팅하는 것이다.
물론 이 부분은 데브피아 및.. 많은 곳에서 이렇게 사용을 하는거라고 추천? 을 하는데;;;
정말 위험한 사용법이다.. (물론 나도 처음엔 이렇게 사용하곤 했었다.... )
만약 이렇게 타입캐스팅해서 글자를 박아 넣을 경우( memcpy나 string 을 집어넣게 되는 경우)
잘못된걸 가장 확실하게 아는 방법은 CString.GetLength() 를 사용하면 바로 알수 있다.
리턴값은 0 이다.. 완젼 망하는 거다.. GetLength() 가 제대로 된 값을 리턴하지 못하기때문에
sizeof(CString...) 을 사용하게 되는데 이때는 4다... 즉 pointer의 크기가 리턴된다..
이 얼마나 위험한 방법인가.... 즉.. 4포인터 사이즈의 어딘가에 이 스트링이 저장이 되며
그럴경우 런타임에 사용되는 힙에 들어가게 되는데;;; 전혀 메모리 alloc이 되지 않은 상태에서
별 생각 없어.. 타입 캐스팅이 되어 error없이 잘 돌아가게 되는? 느낌을 받게 된다..
물론 pointer가 그 위치를 처음에 기억하니 처음에는 잘 나오는것 같은 느낌과 함께...
무시가 되곤 한다..
잡설이 길었다...
그럼 제대로 사용하려면? 어찌 해야 하나..
바로 사용하는 경우에야 CString filepath = "c:/dlfja"; 이런식으로 생성자에 넣으면 되는데
꼭 이럴 경우에만 사용한다면 CString을 사용하겠는가?
아니다... 보통 변하는 어떤 string을 받기 위해 사용하는데;;;
귀찮지만.. char buf[] 같은 캐릭터 형의 변수를 하나 더 만들자..
이후 CString filepath = buf; 로 하게 되면 alloc과 함께 GetLength() 등 모든 것을 다 사용할수 있다.
또한 이것을 다른 메모리에 넣기 위해 바로 (LPTSTR)(LPCTSTR)로 타입캐스팅하지 말고
CString.GetBuffer()를 사용하자.. 이렇게 사용하라고 만들어둔거다...( 물론 내생각이지만..
이게 확실하다.고 본다.)
그외에 Mid 나 ReverseFind, compare등... 은 쉽게 사용할수 있는 함수니.. 잔소리는 여기서 그만!
물론 맆이 달려서 설명해달라고 하면 CString 2탄이 나가겟지만... 이정돈 다 알지 않은가!!
'WindowsPrograming' 카테고리의 다른 글
CString을 LPTSTR로 변환 MFC (0) | 2008.03.22 |
---|---|
MFC 보물지도 (0) | 2008.03.22 |
ApiStart.txt (0) | 2007.04.21 |