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시에 메모리가 스택에 남아있어서 "안녕하세요" 문구가 잘 출력 될 수 있지만 해당 방법은 이미 메모리가 정리된 공간을 가르키고 있기 때문에 틀린 방법입니다.