为什么未分配的内存标记为0xCC?

时间:2012-08-08 12:44:49

标签: c++ visual-studio debugging

  

可能重复:
  When and why will an OS initialise memory to 0xCD, 0xDD, etc. on malloc/free/new/delete?

为什么我没有将记忆初始化为0xCC

将内存设置为0xCC会降低性能,因此必须有理由用此字节填充内存。

3 个答案:

答案 0 :(得分:14)

Inside CRT: Debug Heap Management

  

使用Visual Studio编译程序的调试版本时   在调试器中运行它,你可以看到分配的内存或   deallocated有趣的价值观,如......

     

0xCC使用/ GZ选项编译代码时,未初始化   变量自动分配给该值(在字节级别)。

Magic Number on Wiki

  

CCCCCCCC由Microsoft的C ++调试运行时库用于标记   未初始化的堆栈内存

在Visual Studio CRT源中,\VC\crt\src\malloc.h

#define _ALLOCA_S_STACK_MARKER  0xCCCC

// ...

#undef _malloca
#define _malloca(size) \
__pragma(warning(suppress: 6255)) \
    ((((size) + _ALLOCA_S_MARKER_SIZE) <= _ALLOCA_S_THRESHOLD) ? \
        _MarkAllocaS(_alloca((size) + _ALLOCA_S_MARKER_SIZE), _ALLOCA_S_STACK_MARKER) : \
        _MarkAllocaS(malloc((size) + _ALLOCA_S_MARKER_SIZE), _ALLOCA_S_HEAP_MARKER))

答案 1 :(得分:5)

编译器在调试模式下为您执行此操作,因此,如果您不小心读取未初始化的内存,您将看到独特的0xCC值,并识别您(可能)读取未初始化的内存。 0xCC值具有许多其他有用的属性,例如,如果您不小心执行了一些未初始化的内存,它就是用于调用硬件断点的机器语言指令。

基本原则:可以轻松识别读取未初始化内存时的值。

在您的发布版本中不会发生这种情况。

这项技术是在Writing Solid Code中引入的。

答案 2 :(得分:2)

  

当使用/ GZ选项编译代码时,未初始化的变量会自动分配给该值(在字节级别)。

0xCC是调用断点的机器码指令。有关详细信息see another question