MSVC2015 初始化 class 应该保持未初始化的成员
MSVC2015 initializes class member that should be left uninitialized
我注意到 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应该被默认初始化,这对非class类型没有任何作用,这三种情况都应该发出错误.我的理解在这里正确吗?
通过检查程序集,在构造函数中生成一个 memset 到零 class 个成员,为什么 VS 这样做?在我的理解中,class X 的隐式默认构造函数的语义应该与 X(){} 相同,对吗?
并且通过添加虚函数,隐式构造函数不再是微不足道的,但我不知道 ctor 是否微不足道有什么区别。
编译器开关 /sdl
可能是原因。这是一项清零内存的安全功能。
查看投影属性 -> C++ -> 常规 -> SDL 检查
另请参阅投影属性 -> C++ -> 代码生成中的安全检查 (/GS
)。
同时禁用它们,看看会发生什么。
我注意到 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应该被默认初始化,这对非class类型没有任何作用,这三种情况都应该发出错误.我的理解在这里正确吗?
通过检查程序集,在构造函数中生成一个 memset 到零 class 个成员,为什么 VS 这样做?在我的理解中,class X 的隐式默认构造函数的语义应该与 X(){} 相同,对吗?
并且通过添加虚函数,隐式构造函数不再是微不足道的,但我不知道 ctor 是否微不足道有什么区别。
编译器开关 /sdl
可能是原因。这是一项清零内存的安全功能。
查看投影属性 -> C++ -> 常规 -> SDL 检查
另请参阅投影属性 -> C++ -> 代码生成中的安全检查 (/GS
)。
同时禁用它们,看看会发生什么。