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

标签 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 检查。在这里保持干净以减少保护子句代码的数量。

最佳答案

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;

绝对有效

关于C++ MFC : Memory Leak When Creating CString From Char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39891667/

相关文章:

c++ - 测试原始指针 c++,但找不到泄漏

objective-c - 仪器(分配)并找出哪些对象会产生问题

c# - 我什么时候不应该实现 IDisposable?

visual-c++ - mfc,任何人都可以帮忙设计一种喷枪算法吗,我只是不明白该怎么做

c++ - 缩小命名空间到基础

c++ - 在 TreeView gtkmm 中为行设置标题

Python 嵌入 C++ : ImportError: No module named pyfunction

c++ - C++中的对象事件通信

c++ - 有没有办法在不编写实际文件的情况下将 CString 发送到 CFile?

c++ - CHtmlView 类和焦点