2016-10-06 34 views
1

我在运行尝试从剪贴板中读取时遇到内存泄漏。C++ MFC:从Char创建CString时发生内存泄漏*

样品的编号:

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

    CString rawClipboardData(ch); 

    GlobalUnlock(hglb); 
    CloseClipboard(); 
} 

它是中间行的上方,其根据的Visual Studio使存储器泄漏。此行:

CString rawClipboardData(ch); 

如果我没有运行它,没有泄漏报告。 但是,如果我不运行它,我得到以下调试输出在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检查。只需保持它在这里干净,以减少guard-clause代码的数量。

+0

是什么rawClipboardData?它似乎没有任何标准。 – xaxxon

+0

似乎问题来自'CString'您是否已经开始了解动态分配的位置? – George

+1

@xaxxon rawClipboardData是一个CString变量,我简单地在堆栈上创建(发送“ch”字符指针到它的构造函数中)从char * – 10100111001

回答

-2

GlobalLock(hglb)应该是LPTSTR,所以我会假设泄漏是由于铸造到char*造成的。 For Unicode platforms, TCHAR is defined as synonymous with the WCHAR type.

,你应该能够做到像

CString rawClipboardData = GlobalLock(hglb); 

的东西如果没有,那么

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

一定会努力

+2

这只是(可怜的)猜测。 'GlobalLock'的返回值是'CString' c'tor的**输入**。 c'tor对输入数据进行**复制**。误解输入将导致最坏情况下截断存储值。这**不能**产生资源泄漏。但是,这完全忽视了事实,[CF_TEXT](https://msdn.microsoft.com/en-us/library/windows/desktop/ff729168.aspx)实际上是以“const char *”的形式返回的(vs. 'CF_UNICODETEXT'的'const wchar_t *')。 – IInspectable