MSVC2015初始化应该保持未初始化的类成员

时间:2017-03-23 14:20:12

标签: c++ constructor default-constructor

我注意到MSVC2015初始化应该留下不确定的数据成员。 代码示例和结果:

class A
{
public:
    int i;
};

class B
{
public:
    B(){}
    int i;
};

class C
{
public:
    int i;
    virtual void vf(){}
};

int main()
{
    A a;    
    B b;    
    C c;   

    a.i;     //error C4700 uninitialized local variable used
    b.i;     //ok
    c.i;     //ok
}

如果我理解正确,在1,2,3种情况下,成员i应该默认初始化,对于非类型类型什么都不做,应该为所有三种情况发出错误。我的理解在这里是否正确?

通过检查程序集,在构造函数中生成一个memset给零类成员,为什么VS这样做?根据我的理解,类X的隐式默认构造函数的语义应该与X(){}相同,是不是正确?

通过添加虚函数,隐式构造函数不再是微不足道的,但我不知道如果ctor是微不足道有什么区别。

1 个答案:

答案 0 :(得分:1)

编译器开关/sdl可能是原因。这是一个将内存归零的安全功能。

查看投影属性 - > C ++ - >一般 - > SDL检查

另请参阅投影属性中的安全检查(/GS) - > C ++ - >代码生成。

禁用它们并查看会发生什么。