c++ - 为什么 ATL/MFC 中的 TraceV 会导致内存泄漏?
问题描述
我使用的是 VS2019,C++ 代码编译为 32 位 exe 二进制文件。操作系统是 Windows 10。
TraceV 位于 MSVC\14.24.283\atlmfc\include\atltrace.h 中。
它在内部使用以下代码分配一个 char 或 wchar_t 数组来保存跟踪字符串。
CHeapPtr<wchar_t> wszBuf;
if (!wszBuf.Allocate(chCount))
{
return;
}
wszBuf[0] = '\0';
if (swprintf_s(wszBuf, chCount, L"%ls%ls", wszCategory, pwszMessage) == -1)
{
return;
}
如果您查看 CHeapPtr,内存将在析构函数中被释放。似乎没有理由在这里泄漏任何内存。
在Release模式下,没有内存泄漏(我尝试在任务管理器中监控,内存在很长一段时间内没有增加太多)。
在Debug模式下,使用的内存很快就达到了2G,导致内存分配异常。
我尝试使用_CrtDumpMemoryLeaks(),令我惊讶的是,内存泄漏都是10-50字节的小对象,它们应该在TraceV函数中创建。然而,由于有这么多的痕迹,从内存泄漏转储中我无法确定是哪个 Trace 调用导致了内存泄漏,因此很难调试和逐步了解为什么它没有被释放。
对于那些怀疑泄漏不是来自 TraceV 的 CHeapPtr Allocate 的人,下面有一个快照。如您所见,我在应用程序启动后14秒拍摄了快照,周围有很多年龄超过7秒的char[]和wchar_t[],而那些char[]和wchar_t[]分配在TraceV,这意味着它们不会在 7 秒内被释放!并且7秒的数字会随着时间的推移而不断增加。
这有什么提示吗?
谢谢。
解决方案
推荐阅读
- python - 如何将不存在的类成员函数动态转换为现有的类成员函数
- c# - .Net Core 无法检测到 Microsoft.VisualBasic.FileIO
- autocad - 多行文字。Autolisp 返回“无效点”,但在命令窗口中键入该点有效
- r - 使用 ggplot2 指定图例中的特定中断
- mysql - 列中的两个不同字符串
- javascript - 你可以在 ESLint 中为单行启用全局吗?
- reactjs - 替换 immutableJS 的 .set()
- python - “NameError:名称'int64'未定义”
- android - 如何使 ClipPath 的背景透明?
- opencv - Makefile 不会为 opencv4 设置包含目录