当涉及填充时,堆的MSVC初始化

MSVC initialization of heap when padding is involved

本文关键字:堆的 MSVC 初始化 填充      更新时间:2023-10-16

MSVC内存管理器具有某些十六进制代码,它在调试构建中根据执行的操作标记内存。

特别地,代码0xCDCDCDCD用于标记已分配但未初始化的堆内存。假设我有以下结构:

struct Test
{
   bool foo;
   int value;
   Test() : foo(false), value(0) {}
};

当我分配这个对象时,我的内存看起来像这样吗(请注意,我正在写十六进制字节,因为它们会按顺序出现,在这个例子中没有考虑到端进制)?

00 CD CD CD CD 00 00 00 00

上面,00 CD CD CD表示4字节对齐的布尔值。最后3个字节是0xCD,因为内存管理器将这些值初始化为CD,但是该结构中的布尔值的实际初始化仅触及1字节,因为布尔值在我的机器上仅表示1字节。

这是正确的行为吗?

试试吧。确保使用/MDd或类似的工具进行编译,以链接到调试运行时。(答案是肯定的VS2010)。

如果生成更快的代码,没有什么可以阻止代码生成器写入4字节。或者使用memset(),这是MSVC编译器中常见的优化方法。但这显然没有发生。无论哪种方式都是正确的,读取结构填充是未定义的行为。