繁体   English   中英

Visual C ++似乎是对不应初始化的类的POD成员进行零初始化

[英]Visual C++ seems to be zero-initializing POD members of a class which it shouldn't

我有这样的课:

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对象之后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一个默认的隐式构造函数,问题就解决了。

我终于找到了这个问题的根源。
当类中存在指针成员时,Visual C ++会在调用我定义的构造函数之前插入一个autoclassinit方法调用。 此方法调用在某种程度上与成员初始化rawMemory ,并且对我的rawMemory成员进行了零初始化
可以通过在Visual C ++编译器选项中禁用/sdl来删除此行为。 但是,如果它不是非常关键的性能(或瓶颈),我的建议是保留它不变。
感谢所有尝试提供帮助的人!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM