【问题标题】:C++ on Windows: function to get allocated memory?Windows 上的 C++:获取分配内存的函数?
【发布时间】:2012-05-20 20:53:27
【问题描述】:

我在 C++ 中进行编码,在 Windows 7 上使用 Visual Studio 2008。

我的应用程序有内存泄漏,我可以通过系统监视器看到它。

我需要在代码中发现它。

是否存在返回分配给调用进程的内存量的函数?

【问题讨论】:

  • 知道你分配了多少内存并不能帮助你找到泄漏。
  • @ColeJohnson 这既不是一个好建议,也不是一个有用的评论。操作,见Memory Leak Detection on MSDN
  • 我希望有一个像getAllocatedMem() 这样的函数在某些函数调用之前和之后立即调用,以检查它们是否释放所有内存。你的建议很好,但我将此代码用作库,我不知道如何调试正在运行的库。
  • 我不认为这样的功能存在,也不是一个简单的解决方案。如果您尝试查找泄漏的代码是库,请尝试多次调用您怀疑是问题原因的函数,并查看内存消耗何时爆炸:反复试验。
  • @Cicada:这种方法会产生大量的误报。这家伙可能需要分配分析器或自定义内存管理器。

标签: c++ windows memory-leaks


【解决方案1】:

一种 MSVC 特定的 memleak 检测解决方案

// enable memory leaks detection
#if !defined(NDEBUG)
HANDLE hLogFile = CreateFile( "log.txt", GENERIC_WRITE, FILE_SHARE_WRITE,
                              NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
#endif

_CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_WNDW  | _CRTDBG_MODE_DEBUG );
_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE   | _CRTDBG_MODE_DEBUG );
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE  | _CRTDBG_MODE_WNDW  | _CRTDBG_MODE_DEBUG );

_CrtSetReportFile( _CRT_ASSERT, hLogFile );
_CrtSetReportFile( _CRT_WARN,   hLogFile );
_CrtSetReportFile( _CRT_ERROR,  hLogFile );

int tmpDbgFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpDbgFlag |= _CRTDBG_ALLOC_MEM_DF;
tmpDbgFlag |= _CRTDBG_DELAY_FREE_MEM_DF;
tmpDbgFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag( tmpDbgFlag );

if ( BlockIndex > 0 )
{
    _CrtSetBreakAlloc( BlockIndex );
}

这个令人毛骨悚然的代码启用了所有未分配块的文件协议。当然和MSVCRT的debug版本有很深的联系

【讨论】:

    猜你喜欢
    • 2010-09-19
    • 2012-11-06
    • 2012-06-02
    • 2012-01-16
    • 1970-01-01
    • 2011-10-14
    • 2012-04-12
    • 2017-01-19
    • 1970-01-01
    相关资源
    最近更新 更多