문자열 함수에서 메모리 관리를 어떻게 해야할까요?

kid1402의 이미지

안녕하세요
유니코드와 멀티바이트 문자를 넘나들어야만 하는 프로젝트를 진행 중입니다
두 문자 시스템을 바꿀때마다 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;

제가 생각하는 방식이 맞나요?
아니면 저렇게 할 필요 없이 따로 메모리 관리를 해주지 않아도 되려나요?..물론 이건 가능성이 희박해보이지만..

gramo의 이미지

원하시는게 가능하실 것 같네요.
아니면, apr라이브러리를 사용하던가해서 메모리 풀을 잡아놓고 맘대로 사용하시다가 한꺼번에 해제하시는 식으로 하면될 것 같습니다.

익명 사용자의 이미지

그냥 destination 버퍼를 받는것도 괜찮을 거 같은데요. 그러면 메모리 할당/해제에 대한 고민이 사라지니까요.

static int ConvertToChar( __in const wchar_t *src, __out char *dest, size_t destsize); 과 같이 함수를 정의
하면 될듯합니다. 그리고 "성공, 실패, 버퍼가 모자라다"는 여부를 리턴해주면 될거 같네요.

itisme의 이미지

저의 경우에는

관련된 에러 처리 및 이 후의 플로우 처리를 묶어서 생각하다 보니

new/delete 는 같은 scope에서 처리하는 것을 원칙으로 하고 있습니다.

kid1402의 이미지

일단 메모리가 누수되는건 확실한것 같구요..
제일 간단한 방법이 뭘까 하다가 그냥 익명님이 말씀하신것 처럼 dest 버퍼를 받는걸로 해결했습니다. 지역 고정 변수로 잡아버리니 힙에 갈 일도 없어 신경 안써줘도 되서 제일 편한것 같네요

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.