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

时间:2011-12-07 04:45:44

标签: c++ memory-management heap msvcrt

MSVC内存管理器具有某些十六进制代码,它在调试版本中用于标记内存,具体取决于执行的操作。这些记录在here

特别是,代码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个字节。

这是正确的行为吗?

2 个答案:

答案 0 :(得分:3)

试试吧。确保使用/MDd等进行编译以链接到调试运行时。 (答案在VS2010中是肯定的。)

答案 1 :(得分:1)

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