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

C++ MFC: Memory Leak When Creating CString From Char*

本文关键字:CString 内存 泄漏 创建 MFC Char c++      更新时间:2023-10-16

当我运行尝试从剪贴板读取时,我正在获得内存泄漏。

示例代码:
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:ddvctoolsvc7libsshipatlmfcsrcstrcore.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)。在实际代码中也有null检查。保持这里的整洁可以减少guard子句代码的数量。

GlobalLock(hglb)应该是LPTSTR,所以我假设泄漏是由转换到char*引起的。对于Unicode平台,TCHAR被定义为WCHAR类型的同义词。

你应该能够做一些像

CString rawClipboardData = GlobalLock(hglb);

如果没有,则

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

一定可以