_CrtCheckMemory 使用示例

Posted

技术标签:

【中文标题】_CrtCheckMemory 使用示例【英文标题】:_CrtCheckMemory usage example 【发布时间】:2012-10-22 05:53:02 【问题描述】:

我正在尝试了解如何使用_CrtCheckMemory 来跟踪我正在处理的 Windows 应用程序中的堆损坏。我似乎无法让它返回false。这是我的测试代码:

int* test = new int[1];
for(int i = 0; i < 100; i++)
    test[i] = 1;

assert( _CrtCheckMemory( ) );

在上面的代码中,_CrtCheckMemory( ) 返回 true。我在调试模式下运行。为了获得_CrtCheckMemory 标记问​​题的简单示例,我还需要做什么?

【问题讨论】:

【参考方案1】:

需要一个额外的步骤,您必须说服编译器将默认的 new 运算符替换为调试分配器。只有调试分配器会创建“无人区”区域来检测堆块的不足或覆盖。这是有风险的,使用原始分配器编译的代码不会与没有编译的代码很好地混合。因此,它会强制您明确选择加入。

最好在预编译的头文件(默认为stdafx.h)中完成,这样您就可以确保所有代码都使用调试分配器。像这样:

#ifdef _DEBUG
#  define _CRTDBG_MAP_ALLOC
#  define _CRTDBG_MAP_ALLOC_NEW
#  include <crtdbg.h>
#  include <assert.h>
#endif

CRTDBG 宏将 malloc() 函数和 new 运算符替换。

请注意,您发布的代码将首先触发另一个诊断。在 Windows Vista 及更高版本上,Windows 堆分配器首先会抱怨,因为代码破坏了 Windows 堆的完整性。通过仅索引到 2 来使覆盖更微妙。

【讨论】:

嗯。将您的预编译器内容添加到 stdafx.h 和一个依赖项目,并且在我的数组覆盖后仍然没有停止。我会在这个问题上挠头。显然有一个叫做 gflags 的东西也可以帮助我解决这个问题。 我在发布之前使用您的代码对此进行了测试。工作得很好。如果您使用其他工具,例如 umhd.exe,Gflags 很有用 谢谢。设置一个新的、非常简单的项目,以便我可以看到这个 _CrtCheckMemory 实际工作。 我在 MSVS 2017 上对此进行了测试,不幸的是它不起作用。

以上是关于_CrtCheckMemory 使用示例的主要内容,如果未能解决你的问题,请参考以下文章

Markdown学习语法的记录

无法在 Boost.Python 中使用 __stdcall 编译示例

PHP如何使用SplQueue::__construct()函数?示例

python中的colored logging使用示例

Python多进程multiprocessing使用示例

03_Pinctrl子系统使用示例