2016-10-06 7 views
1

실행시 메모리 누수가 발생하여 클립 보드에서 읽으려고합니다.C++ MFC : CString에서 문자가 생성 될 때의 메모리 누수 *

샘플 코드 :

void SomeFunction() 
{ 
    OpenClipboard(nullptr); 
    HGLOBAL hglb = GetClipboardData(CF_TEXT); 
    char* ch = static_cast<char*>(GlobalLock(hglb)); 

    CString rawClipboardData(ch); 

    GlobalUnlock(hglb); 
    CloseClipboard(); 
} 

이것은 비주얼 스튜디오에 따른 메모리 누수가 발생하는 상기 중간 열이다. 이 행 :

실행하지 않으면 누수가보고되지 않습니다. 그러나 나는 그것을 실행하는 경우 I 얻을 Visual Studio를 출력 창에서 다음 디버그 출력 :

Detected memory leaks! 
Dumping objects -> 
f:\dd\vctools\vc7libs\ship\atlmfc\src\strcore.cpp(158) : {75645} normal block at 0x00000000072C89A0, 52 bytes long. 
Data: <`x    > 60 78 F7 D3 FE 07 00 00 0D 00 00 00 0D 00 00 00 
Object dump complete. 

어떤 아이디어가?

업데이트 : 위 코드에서 OpenClipboard (nullptr)를 추가했습니다. 또한 실제 코드에는 nullptr-check가 있습니다. 보호 절 코드의 양을 줄이려면 여기를 깨끗하게 유지하십시오.

+0

rawClipboardData 무엇을 작동하지 않으면

CString rawClipboardData = GlobalLock(hglb); 

처럼 뭔가를 할 수 있어야한다? 그것은 표준으로 보이지 않습니다. – xaxxon

+0

'CString'에서 문제가 발생했다면 동적 할당이 발생하는 곳을 확인하기 위해이 단계로 들어갔습니까? – George

+1

@xaxxon rawClipboardData는 스택에서 단순히 생성자로 "ch"char 포인터를 보내는 CString 변수입니다. * – 10100111001

답변

-2

GlobalLock (hglb)은 LPTSTR이어야합니다. 따라서 누수가 캐스팅에 의해 char*으로 인해 발생했다고 가정합니다. For Unicode platforms, TCHAR is defined as synonymous with the WCHAR type.

당신이 다음

CString rawClipboardData; 
LPTSTR lptstr = GlobalLock(hglb); 
rawClipboardData = lptstr; 

확실히

+2

그건 그냥 (가난한) 추측이야. 'GlobalLock'의 반환 값은'CString'에 대한 ** 입력 **입니다. c'tor는 입력 데이터의 ** 복사본 **을 만듭니다. 입력을 잘못 해석하면 최악의 경우 저장된 값이 잘 리게됩니다. ** ** 자원 누출을 일으킬 수는 없습니다. 하지만 사실은 [CF_TEXT] (https://msdn.microsoft.com/en-us/library/windows/desktop/ff729168.aspx)는 사실 const char * (vs. 'CF_UNICODETEXT'에 대한'const wchar_t *'). – IInspectable