【问题标题】:MSVC2015 initializes class member that should be left uninitializedMSVC2015 初始化应该保持未初始化的类成员
【发布时间】:2017-08-16 04:01:39
【问题描述】:

我注意到 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 会这样做?在我的理解中,class X 的隐式默认构造函数的语义应该和 X(){} 一样,对吗?

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

【问题讨论】:

  • 读取未初始化的数据是未定义的行为,因此 VS 可以为所欲为。在调试期间,它会尝试通过将变量初始化为零并在代码中有未定义行为时给出警告和错误来提供帮助,但它并不能捕获所有内容。
  • 让我们试试 a.i = 0;而是 a.i; :)

标签: c++ constructor default-constructor


【解决方案1】:

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

查看投影属性 -> C++ -> 常规 -> SDL 检查

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

禁用它们,看看会发生什么。

【讨论】:

    猜你喜欢
    • 2011-07-14
    • 2015-03-22
    • 2019-09-10
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多