보통 구조체나 클래스 안에서 멤버 변수로 CString과 같은 클래스를 많이 사용한다.
그런데 가끔 문제가 생길 소지가 있는 코딩을 하고는 하는데...

오늘은 이에 대해 알아보자.

1. CString을 (LPSTR)로 casting 하여 사용하기.
매우 위험한일이라고 할 수밖에 없다. LPSTR은? unicode가 아닌 곳에서 char *이다. 즉, c에서 사용하는 기본 문자열인데, 그냥 문자열도 아니고 "수정 가능한" 문자열이다. 수정 불가능한 문자열은 LPCSTR인데, 이것은 const char *이다. const가 붙었으니 수정이 안된다.
CString에서, 기본적으로 제공하는 (연산자 오버로딩에 의해) 연산자는 LPCSTR인데, 이는 클래스에 속한 멤버 변수들의 캡슐화를 위해 내부 데이터가 수정될 수 없게 만들어야 하기 떄문에 당연하 처사이다.
이를 LPSTR로 casting하여 사용한다면... 수정하지 말아야 될 문자열이 수정될 수 있으므로, 결국 CString에서 전혀 건드리지도 않은 부분에서 오류가 날 가능성이 있다는 것이다.

이것은 비단 CString 뿐만이 아니라, 다른 class도 마찬가지인데.. 이같은 행위는 2번에서 설명하는것과 비슷하다.

단, MFC에서 제공하는 CRect와 같이 간단한 클래스는 멤버 변수를 직접 허용하게 하므로 클래스의 동작 여부와는 상관 없다.

2. 구조체 안에 CString 를 사용할 때 주의사항
CString 뿐만이 아니다. 하지만 CString을 예로 든 이유는, 대표적으로 문제가 발생할 소지가 있는 클래스 이기 때문이다.

#include <stdafx.h>

typedef struct _MYSTRUCT
{
   int nNumber;
   CString strName;
} MYSTRUCT, *PMYSTRUCT;

int main()
{
   MYSTRUCT item;
   memset(&item, 0, sizeof(item));
   return 0;
}


보통 코딩을 할 때 위의 코드와 같이 구조체를 memset로 초기화 한다.(ZeroMemory()와 같은것 포함) 이럴 때 발생할 수 있는 문제점은?

스택에 item변수에 속한 멤버변수들을 초기화 하는데, 이 때 CString또한 초기화 된다.
CString은 생성자에서 내부적으로 길이가 0인 문자열 포인터를 alloc해놓고 대기하는데,
이를 0으로 초기화 해버리면 CString 내부에서 문자열을 구할 때 NULL포인터를 참조하므로 문제가 발생할 수 있다.

이것을 코드로 표현해보자면..

#include <stdafx.h>

class CMyString
{
public:
   CMyString() { m_pszString = malloc(1024); }
   virtual ~CMyString() { free(m_pszString); }

private:
   char *m_pszString;
};

typedef struct _MYSTRUCT
{
   int nNumber;
   CMyString strName;
} MYSTRUCT, *PMYSTRUCT;

int main()
{
   MYSTRUCT item;
   memset(&item, 0, sizeof(item));
   return 0;
}


대략 이런 경우랄까?
memset을 하게 되면 m_pszString는 0, 즉 NULL 값을 가지므로 나중에 CMyString의 다른 메소드에서 m_pszString을 호출한다면 당연히 오류가 난다.
이를 방지하기 위해서는 memset로 초기화를 하지 말거나, 메모리가 할당되는 부분을 백업(?) 한 뒤 복구하는 방법이 있다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2007/08/17 18:48 2007/08/17 18:48
, ,
Response
No Trackback , 2 Comments
RSS :
http://b4you.net/blog/rss/response/130


블로그 이미지

빗소리를 먹는 사람.

- 장현준

Notices

Archives

Authors

  1. 장현준

Recent Trackbacks

  1. 듀얼클러치의 생각 rsvin28's me2DAY 2009

Calendar

«   2012/02   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

Site Stats

Total hits:
158009
Today:
79
Yesterday:
228