반응형

출처 : 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
Posted by Real_G