C ++ MFC:从Char *创建CString时内存泄漏

时间:2016-10-06 08:53:57

标签: c++ memory-leaks mfc char-pointer

当我尝试从剪贴板中读取时,我收到内存泄漏。

示例代码:

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-checks。只是保持干净,减少保护条款代码的数量。

1 个答案:

答案 0 :(得分:-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;

肯定会有用