可能重复:
When and why will an OS initialise memory to 0xCD, 0xDD, etc. on malloc/free/new/delete?
为什么我没有将记忆初始化为0xCC
?
将内存设置为0xCC
会降低性能,因此必须有理由用此字节填充内存。
答案 0 :(得分:14)
Inside CRT: Debug Heap Management
使用Visual Studio编译程序的调试版本时 在调试器中运行它,你可以看到分配的内存或 deallocated有趣的价值观,如......
0xCC使用/ GZ选项编译代码时,未初始化 变量自动分配给该值(在字节级别)。
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。