본문 바로가기
카테고리 없음

[C/C++] 함수 리턴값에 LPCWSTR (const wchar *) 사용하기

by hjahn 2020. 8. 30.

1. new, delete를 이용한 방법

LPCWSTR testfunction()
{
    WCHAR *pBuff = new WCHAR[260];
    wcscpy_s(pBuff, 260, L"안녕하세요";
    return (LPCWSTR)pBuff;
}

void main()
{
    LPCWSTR pStr = testfunction();
    wprintf("%s", pStr);
    delete []pStr;
}

new 를 이용해서 메모리를 힙에 할당하고 사용 후 메모리 해제해 주어야 합니다.

2. 정적(static)변수를 이용 하는 방법

LPCWSTR testfunction()
{
    static WCHAR szBuff[260] = {0,};
    wcscpy_s(szBuff, 260, L"안녕하세요";
    return (LPCWSTR)szBuff;
}

void main()
{
    LPCWSTR pStr = testfunction();
    wprintf("%s", pStr);
}

static을 이용하면 szBuff 가 데이터 영역에 할당되며 testfunction이 끝나도 메모리가 정리되지 않습니다.

함수 내에서 static으로 선언 후, 사용한 문자열을 리턴할 수 있습니다.

3. 궁금점 

PathFindExtension은 리턴값이 LPCWSTR인데 왜 delete하라는 말도 없을까?

함수내부에서 static으로 선언되어 있나??? 확인해 보았습니다.

실행 결과 함수 첫번째 인자로 입력받은 szFilePath 의 주소에서 확장자를 찾아 확장자의 주소를 리턴해주고 있는 것...!!

 

LPCWSTR로 리턴하려면 위의 방법 외에, 함수 호출 후 정리되는 지역변수가 아니라면 리턴이 가능합니다.

class CTest()
{
public:
    CTest();
    ~CTest();

public:
    CString m_strBuff;
}
LPCWSTR Ctest::GetData()
{
    return m_strBuff;
}

위와 같이 멤버변수를 넘겨주는 용도로도 사용 가능합니다.

 

* 틀린 방법

LPCWSTR testfunction()
{
    WCHAR szBuff[] = L"안녕하세요"
    LPCWSTR pBuff = szBuff;
    return pBuff;
}

void main()
{
    LPCWSTR pStr = testfunction();
    wprintf("%s", pStr);
}

szBuff 는 지역변수로 선언된 변수이며 스택에 할당됩니다.

pBuff에 포인터를 저장해서 리턴하면 visualstudio에서는 지역변수인지 알 수 없는 포인터가 되어 warning을 발생하지 않습니다. main에서 wprintf시에 메모리가 스택에 남아있어서 "안녕하세요" 문구가 잘 출력 될 수 있지만 해당 방법은 이미 메모리가 정리된 공간을 가르키고 있기 때문에 틀린 방법입니다.