Visual C++ 类POD成员非预期零初始化问题咨询
Visual C++ 中POD成员意外零初始化的诡异问题
最近碰到一个特别反直觉的Visual C行为,按C标准完全不该发生的零初始化,居然在特定场景下出现了,给大家拆解一下整个过程:
初始符合预期的场景
一开始我定义了这么个类,特意不想让构造函数初始化里面的rawMemory数组:
class TestClass { public: TestClass() {}; // 刻意不初始化rawMemory int rawMemory[32]; }; int main() { TestClass obj; return 0; }
这时候的表现完全正常:Debug模式下rawMemory被填充为0xcc(VC的Debug模式未初始化内存标记),Release模式则是随机垃圾值,完全符合C标准——用户自定义构造函数不会自动初始化未在构造函数里提及的POD成员。
添加指针成员后出现异常
但当我给类加了一个指针成员ptr之后,怪事发生了:
class TestClass { public: TestClass() {}; int rawMemory[32]; int* ptr; }
原本应该是未初始化状态的rawMemory,居然被零初始化了!我以为是数组类型的问题,换成std::aligned_storage来模拟内存,结果问题依然存在:
class TestClass { public: TestClass() {}; std::aligned_storage<sizeof(int), alignof(int)>::type rawMemory[32]; int* ptr; }
其他编译器表现正常
我用g++测试了完全相同的代码,它的表现就完全符合标准:不管有没有添加指针成员,未被构造函数显式初始化的POD成员都是未定义状态(Release下是随机值),没有出现零初始化的情况。
特殊修复场景
还有个值得注意的细节:如果把这个类改成结构体,或者直接删掉自定义构造函数,让编译器生成默认的隐式构造函数,这个异常的零初始化行为就立刻消失了,回到了符合预期的状态。
内容的提问来源于stack exchange,提问作者ph3rin
相关产品推荐
相关产品推荐

