我注意到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是微不足道有什么区别。
答案 0 :(得分:1)
编译器开关/sdl
可能是原因。这是一个将内存归零的安全功能。
查看投影属性 - > C ++ - >一般 - > SDL检查
另请参阅投影属性中的安全检查(/GS
) - > C ++ - >代码生成。
禁用它们并查看会发生什么。