在一个非常简单的程序中检测到内存泄漏。该怎么办?
Memory leak detected in a very simple program. What to do?
我的大程序有内存泄漏,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++
我的系统是:
- 微软 Visual Studio 专业版 2012
- 版本 11.0.61030.00 更新 4
- Visual C++ 2012 04938-004-0034007-02224
- Windows 7
您的调用堆栈表明,除了 Visual C++ 运行时函数之外,还使用了另一个内存泄漏工具。
使用 google 将我带到这个 link:https://github.com/auser/cpputest/blob/master/src/CppUTest/MemoryLeakWarningPlugin.cpp
因此,cppuTest
可能在您不知情的情况下应用于您的简单项目。
我建议您创建一个全新的 Win32 控制台应用程序,复制并粘贴您的代码,然后重新测试。确保新项目没有额外的依赖。
刚刚在安装了 Deleaker 的干净 VS 2012 安装中进行了尝试。没有显示泄漏。 CRT 在决赛中没有输出。
堆栈跟踪中提到的 MemoryLeakWarningPlugin 是什么?似乎是 CppUTest 的一部分(我做了 Google 一点)。
我认为要么是 MemoryLeakWarningPlugin 自身泄漏,要么是它以某种方式破坏了 CRT 诊断系统。
我的大程序有内存泄漏,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++
我的系统是:
- 微软 Visual Studio 专业版 2012
- 版本 11.0.61030.00 更新 4
- Visual C++ 2012 04938-004-0034007-02224
- Windows 7
您的调用堆栈表明,除了 Visual C++ 运行时函数之外,还使用了另一个内存泄漏工具。
使用 google 将我带到这个 link:https://github.com/auser/cpputest/blob/master/src/CppUTest/MemoryLeakWarningPlugin.cpp
因此,cppuTest
可能在您不知情的情况下应用于您的简单项目。
我建议您创建一个全新的 Win32 控制台应用程序,复制并粘贴您的代码,然后重新测试。确保新项目没有额外的依赖。
刚刚在安装了 Deleaker 的干净 VS 2012 安装中进行了尝试。没有显示泄漏。 CRT 在决赛中没有输出。
堆栈跟踪中提到的 MemoryLeakWarningPlugin 是什么?似乎是 CppUTest 的一部分(我做了 Google 一点)。
我认为要么是 MemoryLeakWarningPlugin 自身泄漏,要么是它以某种方式破坏了 CRT 诊断系统。