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个字节。
这是正确的行为吗?
答案 0 :(得分:3)
试试吧。确保使用/MDd
等进行编译以链接到调试运行时。 (答案在VS2010中是肯定的。)
答案 1 :(得分:1)
没有什么可以阻止代码生成器写入4个字节,如果它产生更快的代码。或者使用memset(),这是MSVC编译器中的常见优化。但这显然没有发生。无论哪种方式都是正确的,读取结构填充是未定义的行为。