【问题标题】:Strange "Memory Leak Detection" error C++奇怪的“内存泄漏检测”错误 C++
【发布时间】:2012-11-14 15:48:55
【问题描述】:

我有一个非常奇怪的内存泄漏问题。我使用 _CrtDumpMemoryLeaks 来检查泄漏。这是我的 WinMain 函数:

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    ////////////////// SET UP CHECKS FOR MEMORY LEAKS ////////////////////
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
    //////////////////////////////////////////////////////////////////////


    _CrtDumpMemoryLeaks(); // Reports leaks to stderr

    return 0;
}

如您所见,我已经完全删除了其中的所有内容,只是为了检查我是否收到了某种误报。

在我关闭一个应用程序后,我在输出中看到了一堆内存泄漏:

Detected memory leaks!
Dumping objects ->
{1343} normal block at 0x06076780, 8 bytes long.
 Data: < g      > 20 67 07 06 00 00 00 00 
{1342} normal block at 0x06076710, 52 bytes long.
 Data: <@   @   @       > 40 16 07 06 40 16 07 06 40 16 07 06 01 00 CD CD 
{1341} normal block at 0x060766B0, 32 bytes long.
 Data: <C:/Windows/Fonts> 43 3A 2F 57 69 6E 64 6F 77 73 2F 46 6F 6E 74 73 
{1339} normal block at 0x0607F438, 16 bytes long.
 Data: <              P > C0 17 0B 01 01 00 00 00 01 00 00 00 80 13 50 04 
{1338} normal block at 0x04501380, 8 bytes long.
 Data: <    H   > BC 0D 0B 01 48 18 07 06 
{1295} normal block at 0x060716B0, 8 bytes long.
 Data: <        > B4 B3 0B 01 00 00 00 00 
{1294} normal block at 0x06071640, 52 bytes long.
 Data: < g   g   g      > 10 67 07 06 10 67 07 06 10 67 07 06 01 01 CD CD 
{1293} normal block at 0x0450DFB8, 8 bytes long.
 Data: < !    P > E0 21 0B 01 98 05 50 04 
{1292} normal block at 0x0450E110, 8 bytes long.
 Data: <  P     > E8 05 50 04 00 00 00 00 
// (There's like thousand more of those...)
Object dump complete.

我完全不知道它们是从哪里来的。

提前感谢您的任何回答。

【问题讨论】:

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


    【解决方案1】:

    检查输出窗口。你看到一堆 DLL 被加载了吗?它们中的任何一个都可能在调用泄漏输出之前静态初始化未释放的数据结构。尝试使用提示 here 排除一些噪音,方法是将泄漏检查括在特定的执行时间范围内。

    由于静态初始化的 Google Test 单例需要在堆上分配,Visual C++ 内存泄漏检测器将在程序运行结束时报告内存泄漏。避免这种情况的最简单方法是使用 _CrtMemCheckpoint 和 _CrtMemDumpAllObjectsSince 调用来不报告任何静态初始化的堆对象。有关更多详细信息和其他堆检查/调试例程,请参阅 MSDN。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 2011-03-13
      • 2015-05-09
      • 2021-03-28
      • 2020-12-19
      相关资源
      最近更新 更多