我有一堂这样的课:
class TestClass
{
public:
TestClass() {};
//Note: I wish not to initialize rawMemory (for whatever reason)
int rawMemory[32];
};
int main()
{
TestClass obj;
return 0;
}
在我创建了一个TestClass
对象使用TestClass obj;
我得到了我想要的行为:rawMemory 未初始化(在调试模式下填充 0xcc,在发布模式下填充随机未确定值)。
然而,当我向类添加指针成员时:
class TestClass
{
public:
TestClass() {};
int rawMemory[32];
int* ptr;
};
The 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
member.
可以通过禁用来删除此行为/sdl
在 Visual C++ 编译器选项中。但是,如果它不是非常关键的性能(或瓶颈),我的建议是保持原样。
感谢所有试图提供帮助的人!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)