【问题标题】:Why does the not allocated memory is marked like 0xCC? [duplicate]为什么未分配的内存标记为0xCC? [复制]
【发布时间】:2012-08-05 13:56:15
【问题描述】:

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

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

【问题讨论】:

    标签: c++ visual-studio debugging


    【解决方案1】:

    Inside CRT: Debug Heap Management

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

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

    Magic Number on Wiki:

    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))
    

    【讨论】:

      【解决方案2】:

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

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

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

      这项技术是在Writing Solid Code 中引入的。

      【讨论】:

        【解决方案3】:

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

        0xCC 是调用断点的机器代码指令。欲了解更多信息see another question

        【讨论】:

          猜你喜欢
          • 2014-07-06
          • 2011-02-16
          • 1970-01-01
          • 2021-10-16
          • 2021-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多