포트폴리오/게임스쿨 졸작

6. 메모리 릭 잡기

codehunter 2010. 5. 31. 23:14

문자열쪽에 메모리릭이 발생되는걸로 봐서 문자열에 관여하는 어떤 함수가 생각났다. 바로 와이드<->ANSI 변환 함수들!!

헤더파일

// 유니코드를 ANSI코드로
char* LPCWSTR2STR(const WCHAR* wstr);
void LPCWSTR2STR_Release(char* str);

// ANSI코드를 유니코드로
WCHAR* LPCSTR2WSTR(const char* str);
void LPCSTR2WSTR_Release(WCHAR* wstr);




본체


//>> 유니코드에서 ANSI 문자열로의 변환 방법
char* LPCWSTR2STR(const WCHAR* wstr)
{
 if ( wstr )  {
  char* str = NULL;
  int nLen = WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, 0, NULL, NULL);
  str = (char*)malloc(nLen+1);
  WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, 512, NULL, NULL);
  return str;
 }
 else
  return NULL;
}
// LPCWSTR2STR 쓰고 나면 반드시 이 함수를 호출해야 메모리 릭이 없음
void LPCWSTR2STR_Release(char* str)
{
 free(str);
}
//>> ANSI 문자열에서 유니코드로의 변환 방법
WCHAR* LPCSTR2WSTR(const char* str)
{
 if ( str )  {
  WCHAR* wstr = NULL;
  int nLen = MultiByteToWideChar(CP_ACP, 0, str, static_cast<int>(strlen(str)), NULL, NULL);
  wstr = SysAllocStringLen(NULL, nLen);
  MultiByteToWideChar(CP_ACP, 0, str, static_cast<int>(strlen(str)), wstr, nLen);
  return wstr;
 }
 else
  return NULL;
}
// LPCSTR2WSTR 쓰고 나면 반드시 이 함수를 호출해야 메모리 릭이 없음
void LPCSTR2WSTR_Release(WCHAR* wstr)
{
 SysFreeString(wstr);
}


사용예

WCHAR msg[80];
...
char* msg_c =  LPCWSTR2STR(msg);
 pFont->DrawText(x, y, msg_c, COLOR(0.0f, 1.0f, 0.0f, 1.0f));
 LPCWSTR2STR_Release(msg_c);


바로 저 위의 할당함수만 있었을때 해제함수가 없었을때 메모리가 샜던것이다. 변환구현에만 신경쓴 나머지... 쩝
좀더 세련된 방식으로 구현할까도 생각했는데 걍 귀찮아서 그냥 고고
체크해보니까 SysAllocStringLen()으로 할당한건 메모리릭에 잡히질 않지만 그래도 혹시 모르니까 다 해줬다.

'포트폴리오 > 게임스쿨 졸작' 카테고리의 다른 글

8. 이벤트구조, 씬관리구조로 변경...  (0) 2010.06.03
7. 어뢰와 폭뢰 클래스 제작  (0) 2010.05.31
개발 5일차  (0) 2010.05.27
개발 4일차  (0) 2010.05.27
개발 3일차  (0) 2010.05.25