8

为什么我尚未初始化的内存设置为0xCC

将内存设置为0xCC会降低性能,所以用这个字节填充内存肯定是有原因的。

4

3 回答 3

14

CRT 内部:调试堆管理

当您使用 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))
于 2012-08-08T12:47:50.050 回答
5

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

基本原则:易于识别来自读取未初始化内存的值。

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

这种技术是在编写实体代码中介绍的。

于 2012-08-08T13:06:17.807 回答
2

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

0xCC 是调用断点的机器代码指令。有关详细信息,请参阅另一个问题

于 2012-08-08T12:52:41.497 回答