【问题标题】:Memory leak detected in a very simple program. What to do?在一个非常简单的程序中检测到内存泄漏。该怎么办?
【发布时间】:2015-01-29 09:37:38
【问题描述】:

Visual Studio CRT 调试系统检测到我的大程序中存在内存泄漏。我将程序简化为以下内容,但仍然显示内存泄漏。

#include "stdafx.h"
#include "crtdbg.h"

int main()
{
    int tmp = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
    _CrtSetDbgFlag(tmp | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    int* k = new int(8);
    delete k;
    return 0;
}

当我在我的 Visual Studio 2012 系统中运行它时,我看到以下内容:

Detected memory leaks!
Dumping objects ->
{65} normal block at 0x00663008, 4424 bytes long.
 Data: <X    #f         > 58 CF 14 00 90 23 66 00 01 00 00 00 00 00 00 00 
{64} normal block at 0x00662390, 4 bytes long.
 Data: <    > 00 C3 14 00 
Object dump complete.

如果我删除分配和解除分配,则不会出现泄漏。如果我用任何使用内存分配的标准库功能(例如std::string k)替换分配和解除分配,就会出现泄漏。

为什么会出现内存泄漏?如何删除它们?


我尝试通过将_crtBreakAlloc 设置为 64 来调试我的问题;系统停在一个应该帮助我的地方(见下面的堆栈跟踪)。但我不知道如何处理这些信息。

>   test_it.exe!_heap_alloc_dbg_impl(unsigned int nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 393   C++
    test_it.exe!_nh_malloc_dbg_impl(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 239    C++
    test_it.exe!_nh_malloc_dbg(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine) Line 302  C++
    test_it.exe!malloc(unsigned int nSize) Line 56  C++
    test_it.exe!_PlatformSpecificMalloc()  Unknown
    test_it.exe!MemoryLeakWarningPlugin::ignoreAllLeaksInTest(void) Unknown
    test_it.exe!operator new(unsigned int)  Unknown
    test_it.exe!MemoryLeakWarningPlugin::getGlobalDetector(void)    Unknown
    test_it.exe!std::error_condition::value(void)   Unknown
    test_it.exe!operator new(unsigned int)  Unknown
    test_it.exe!main() Line 9   C++

我的系统是:

  • Microsoft Visual Studio 专业版 2012
  • 版本 11.0.61030.00 更新 4
  • Visual C++ 2012 04938-004-0034007-02224
  • Windows 7

【问题讨论】:

  • 如果您只调用_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 而不将它们与现有位集组合会发生什么?
  • @sjdowling 没有变化
  • 您链接到哪个运行时库?如果是Multithread Debug DLL,把它改成Multithread Debug,看看rebuild并重新运行你的应用后问题是否仍然存在..
  • @PaulMcKenzie 我已经在使用Multi-threaded Debug (/MTd)(从项目设置中复制)
  • @anatolyg - 据我所知,您调用堆栈中的这些函数是不是 Visual C++ 运行时内部函数。使用谷歌将我带到这里:github.com/auser/cpputest/blob/master/src/CppUTest/…。我建议您创建一个全新的、原始的 Win32 控制台应用程序并重新测试您的代码。

标签: c++ visual-studio-2012 memory-leaks msvcrt


【解决方案1】:

您的调用堆栈表明除了 Visual C++ 运行时函数之外,还使用了另一个内存泄漏工具。

使用谷歌将我带到此链接:https://github.com/auser/cpputest/blob/master/src/CppUTest/MemoryLeakWarningPlugin.cpp

因此,cppuTest 可能会在您不知情的情况下应用于您的简单项目。

我建议您创建一个全新的 Win32 控制台应用程序,复制并粘贴您的代码,然后重新测试。确保新项目没有其他依赖项。

【讨论】:

    【解决方案2】:

    刚刚在安装了 Deleaker 的情况下使用干净的 VS 2012 安装进行了尝试。未显示泄漏。并且在决赛中没有来自 CRT 的输出。

    堆栈跟踪中提到的 MemoryLeakWarningPlugin 是什么?似乎它是 CppUTest 的一部分(我做了一点谷歌)。

    我认为要么 MemoryLeakWarningPlugin 自身泄漏,要么以某种方式破坏 CRT 诊断系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 2021-07-11
      • 1970-01-01
      • 2021-09-01
      • 2012-02-22
      相关资源
      最近更新 更多