我有这样的类:
class TestClass
{
public:
TestClass() {};
//Note: I wish not to initialize rawMemory (for whatever reason)
int rawMemory[32];
};
int main()
{
TestClass obj;
return 0;
}
在我使用 TestClass obj;
创建了一个 TestClass
对象后,我得到了我想要的行为:rawMemory 没有被初始化(在调试模式下填充0xcc,在发布模式下填充随机未确定的值(。
当我向类添加指针成员时:
class TestClass
{
public:
TestClass() {};
int rawMemory[32];
int* ptr;
};
rawMemory
初始化为零!我认为根据标准,这不应该发生。我什至尝试使用专用于保留未初始化自动内存的std::aligned_storage
,rawMemory
仍然初始化为零!
class TestClass
{
public:
TestClass() {};
std::aligned_storage<sizeof(int), alignof(int)>::type rawMemory[32];
int* ptr;
};
注意:我已经尝试过g ++,它按预期工作。
更新:如果我将TestClass更改为结构,则问题就消失了;如果我给TestClass
一个默认的隐式构造函数,问题就消失了。
我终于找到了这个问题的根源。
当类中存在指针成员时,Visual C++ 会在调用我定义的构造函数之前插入一个autoclassinit
方法调用。此方法调用有点搞砸了成员初始化,并且它确实将我的rawMemory
成员初始化为零。
可以通过禁用 Visual C++ 编译器选项中的/sdl
来删除此行为。但是,如果它不是非常注重性能(或瓶颈(,我的建议是保持原样。
感谢所有试图提供帮助的人!