문자열 함수에서 메모리 관리를 어떻게 해야할까요?
글쓴이: kid1402 / 작성시간: 목, 2012/07/26 - 11:16오전
안녕하세요
유니코드와 멀티바이트 문자를 넘나들어야만 하는 프로젝트를 진행 중입니다
두 문자 시스템을 바꿀때마다 WideCharToMultiByte나 MultiByteToWideChar를 만드는게 귀찮아서 다음과 같은 함수를 만들어서 일단은 잘 쓰고 있는데요..
#pragma once static char* ConvertToChar( __in const wchar_t *src) { char* dest = NULL; int charLength = WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, 0, NULL, NULL); dest = new char[charLength]; WideCharToMultiByte(CP_ACP, 0, src, -1, dest, charLength, 0, 0); return dest; } static wchar_t* ConvertToWideChar( __in const char* src) { wchar_t *dest = NULL; int wideCharLength = MultiByteToWideChar(CP_ACP, 0, src, -1, NULL, NULL); dest = new WCHAR[wideCharLength]; MultiByteToWideChar(CP_ACP, 0, src, strlen(src)+1, dest, wideCharLength) ; return dest; }
일단 코드는 정상적으로 잘 작동합니다. 컴파일도 되고 런타임 에러도 없어요
그런데 궁금한게 저 함수 안에서 문자열 변환 결과를 담기 위해서 char 또는 WCHAR형 배열을 new로 동적할당 받았잖아요?
그럼 이 동적할당된 메모리에 대한 처리를 해주긴 해줘야 겠는데.. 어디서 해줘야할까요?
생각없이 일단 편한대로 만들어놓고 쓰다보니 기본적인 메모리 관리를 잊고 있었던거 같아서요..
함수 안에서 delete을 하자니 함수 자체의 의미가 없어질것 같아서, 일단 생각하기에는 저 함수의 리턴 값을 포인터로 받아서 저장해뒀다가 해당 문자열에 대한 사용이 끝나면 그 포인터를 delete하는..
말하자면 다음과 같은 코드가 될것 같은데요.
char * multi_byte = ::ConvertToChar(wide_char); ... /* 여기서 리턴된 mutli_byte로 작업을 다 하고 */ ... delete multi_byte;
제가 생각하는 방식이 맞나요?
아니면 저렇게 할 필요 없이 따로 메모리 관리를 해주지 않아도 되려나요?..물론 이건 가능성이 희박해보이지만..
Forums:
c++라면 스마트 포인터 객체같은 걸 이용하면 ..
원하시는게 가능하실 것 같네요.
아니면, apr라이브러리를 사용하던가해서 메모리 풀을 잡아놓고 맘대로 사용하시다가 한꺼번에 해제하시는 식으로 하면될 것 같습니다.
보통 C의 문자열 함수들처럼
그냥 destination 버퍼를 받는것도 괜찮을 거 같은데요. 그러면 메모리 할당/해제에 대한 고민이 사라지니까요.
static int ConvertToChar( __in const wchar_t *src, __out char *dest, size_t destsize); 과 같이 함수를 정의
하면 될듯합니다. 그리고 "성공, 실패, 버퍼가 모자라다"는 여부를 리턴해주면 될거 같네요.
저의 경우에는 관련된 에러 처리 및 이 후의 플로우
저의 경우에는
관련된 에러 처리 및 이 후의 플로우 처리를 묶어서 생각하다 보니
new/delete 는 같은 scope에서 처리하는 것을 원칙으로 하고 있습니다.
음..
일단 메모리가 누수되는건 확실한것 같구요..
제일 간단한 방법이 뭘까 하다가 그냥 익명님이 말씀하신것 처럼 dest 버퍼를 받는걸로 해결했습니다. 지역 고정 변수로 잡아버리니 힙에 갈 일도 없어 신경 안써줘도 되서 제일 편한것 같네요
댓글 달기