为什么我尚未初始化的内存设置为0xCC
?
将内存设置为0xCC
会降低性能,所以用这个字节填充内存肯定是有原因的。
当您使用 Visual Studio 编译程序的调试版本并在调试器中运行它时,您会看到分配或释放的内存具有有趣的值,例如...
0xCC 使用 /GZ 选项编译代码时,未初始化的变量会自动分配给该值(在字节级别)。
CCCCCCCC 被微软的 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))
编译器在调试模式下为您执行此操作,因此如果您不小心读取了未初始化的内存,您将看到独特的 0xCC 值,并识别出您(可能)读取了未初始化的内存。0xCC 值还有许多其他有用的属性,例如,如果您不小心执行了一些未初始化的内存,它是用于调用软件断点的机器语言指令。
基本原则:易于识别来自读取未初始化内存的值。
这不会发生在您的发布版本中。
这种技术是在编写实体代码中介绍的。
当使用 /GZ 选项编译代码时,未初始化的变量会自动分配给该值(在字节级别)。
0xCC 是调用断点的机器代码指令。有关详细信息,请参阅另一个问题。