【发布时间】:2012-08-05 13:56:15
【问题描述】:
为什么我没有初始化的内存设置为0xCC?
将内存设置为0xCC会降低性能,所以用这个字节填充内存肯定是有原因的。
【问题讨论】:
标签: c++ visual-studio debugging
为什么我没有初始化的内存设置为0xCC?
将内存设置为0xCC会降低性能,所以用这个字节填充内存肯定是有原因的。
【问题讨论】:
标签: c++ visual-studio debugging
Inside CRT: Debug Heap Management
当您使用 Visual Studio 编译程序的调试版本时, 在调试器中运行它,您可以看到分配的内存或 deallocated 具有有趣的值,例如...
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 值还有很多其他有用的属性,例如它是机器语言指令,用于在您不小心执行一些未初始化的内存时调用软件断点。
基本原则:易于识别来自读取未初始化内存的值。
这不会发生在您的发布版本中。
这项技术是在Writing Solid Code 中引入的。
【讨论】:
当使用 /GZ 选项编译代码时,未初始化的变量会自动分配给该值(在字节级别)。
0xCC 是调用断点的机器代码指令。欲了解更多信息see another question。
【讨论】: