【问题标题】:Why variables are initialized with max value instead of zero为什么变量用最大值而不是零初始化
【发布时间】:2013-09-11 12:09:24
【问题描述】:

多年没用C++,现在用test写c++项目。

当我开始调试时,我发现变量默认不初始化为零很奇怪。 例如,当我查看我的类未初始化变量(unsigned int)时,我看到它的值 3452816845 insted of expected zeo ... 那会导致单元测试中的错误。 我使用这样的初始化:

TEST_METHOD(TestPlus)
        {
            Entity* entity = new Entity();
            entity->mCreateOperator(entity->Plus);
            entity->SetContactValue(1);
            entity->SetContactValue(2);
            entity->mProcessLast();
            Assert::IsTrue(entity->GetContactValue((1+2));
        }

我有实体类的默认构造函数:

Entity::Entity(void)    {/*some internal array initialization*/}

我认为当我使用 new 关键字时,所有类变量都将由 C++ 运行时初始化为 0..

我错过了什么吗?

【问题讨论】:

  • 你想知道为什么你的未初始化变量没有初始化? :)
  • 不是最大值,只是内存中的某个值。
  • 不是随机值。显然,您在 Debug 构建中使用了 MSVC++。 3452816845 = 0xcdcdcdcd,用于初始化从堆分配的内存的值。它旨在导致错误,你假设你会得到零是错误的。你的班级不是一个豆荚。删除默认构造函数,然后重试。

标签: c++ variables initialization


【解决方案1】:

您的类的数据成员未初始化,特别是因为您明确要求编译器未初始化它们。您通过编写一个默认构造函数来完成此操作,该构造函数不执行任何初始化操作

Entity::Entity(void) { /*some internal array initialization*/ }

如果你的类没有用户定义的构造函数,那么这个语法

Entity* entity = new Entity();

将触发新对象的所谓值初始化,这确实会将Entity 的所有直接标量数据成员设置为零。

但是,在您编写自己的默认构造函数 Entity::Entity() 的那一刻,您基本上告诉编译器您要禁止 Entity 类的值初始化,并且要手动初始化此类成员。所以现在你必须做到这一点:手动初始化Entity 的所有直接标量数据成员。由于您没有在构造函数中执行此操作,因此这些成员未初始化。

【讨论】:

    【解决方案2】:

    实际上,值3452816845 (0xCDCDCDCD) 是 Microsoft 运行时用来识别未初始化变量的特殊填充模式。编译器这样做是为了让您可以检测何时忘记初始化变量,并且该值被选为“好”值,因为它不是有效地址并且是无符号的大数字,并且是“大”有符号范围内的负数,因此当您的代码使用这些值之一时,通常很容易注意到出现问题 - 它几乎总是超出您期望的范围。

    【讨论】:

      【解决方案3】:

      除非该类型有一个默认构造函数或者是一个静态变量,否则它根本不会被初始化。因此,读取该值是未定义的行为。

      int a; //namespace scope (static storage) - value-initialized (0)
      void foo()
      {
          int x;  
          //reading x is illegal, you can only assign to it
          static int y;
          //guaranteed to be value-initialized (0)
      }
      

      【讨论】:

      • 另外,int x{} 应该将其初始化为 0。
      • 我的实体类 Entity::Entity(void) { } 有一个默认构造函数
      • 并使用新的keyvord来初始化对象。这还不够吗?
      • @Brans 你在构造函数中初始化了int 成员吗?
      • @Brans 缺少初始化是一个烦人的功能。它的存在是因为有时(很少)您实际上并不想初始化一个值:实际上,它会产生很多很多的错误,而且处理起来很头疼。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      相关资源
      最近更新 更多