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

Ser*_*kyi 7 c++ debugging visual-studio

可能重复:
操作系统在malloc/free/new/delete上将内存初始化为0xCD,0xDD等的时间和原因是什么?

为什么内存我没有初始化设置为0xCC

将内存设置为0xCC会降低性能,因此必须有一个填充内存的原因.

Rom*_* R. 14

内部CRT:调试堆管理

当您使用Visual Studio编译程序的调试版本并在调试器中运行它时,您可以看到分配或取消分配的内存具有有趣的值,例如...

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

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))
Run Code Online (Sandbox Code Playgroud)


Ken*_*oom 5

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

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

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

这种技术是在编写固体代码中引入的.


归档时间:

查看次数:

4369 次

最近记录:

6 年,4 月 前