我有这样一门课:
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;
};rawMemory被初始化为零!我认为按照标准,这是不应该发生的。我甚至尝试使用std::aligned_storage,它专门用于保留未初始化的自动内存,而rawMemory仍然得到零初始化!
class TestClass
{
public:
TestClass() {};
std::aligned_storage<sizeof(int), alignof(int)>::type rawMemory[32];
int* ptr;
};注意:我试过g++,它如我所期望的那样起作用了。
TestClass更新:如果我将TestClass转换为一个结构,问题就解决了;如果我给一个默认的隐式构造函数,问题就解决了。
发布于 2019-04-19 13:06:15
我终于找到了这个问题的根源。
当类中存在指针成员时,VisualC++在调用我定义的构造函数之前插入一个autoclassinit方法调用。这个方法调用有点混淆了成员初始化,而rawMemory 对my 进行了零初始化。
可以通过禁用Visual/sdl编译器选项中的/sdl来删除此行为。然而,如果它不是非常关键的性能(或瓶颈),我的建议是保留它的现状。
感谢所有想帮忙的人!
https://stackoverflow.com/questions/55760694
复制相似问题