首页 > 解决方案 > 为什么 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秒的数字会随着时间的推移而不断增加。

内存快照

这有什么提示吗?

谢谢。

标签: c++visual-c++memory-leaksmfcatl

解决方案


推荐阅读