문자열쪽에 메모리릭이 발생되는걸로 봐서 문자열에 관여하는 어떤 함수가 생각났다. 바로 와이드<->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);
}
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;
}
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);
}
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);
...
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 |