视觉C++似乎正在零初始化一个不应该的类的 POD 成员



我有这样的类:

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_storagerawMemory仍然初始化为零!

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来删除此行为。但是,如果它不是非常注重性能(或瓶颈(,我的建议是保持原样。
感谢所有试图提供帮助的人!

相关内容

  • 没有找到相关文章

最新更新