为什么用最大值而不是零来初始化变量

时间:2013-09-07 13:40:54

标签: c++ variables initialization

我多年没有使用C ++了,现在我用test编写了c ++项目。

当我开始调试时,我发现奇怪的是,默认情况下变量没有初始化为零。 例如,当我看到我的类未初始化的变量(unsigned int)时,我看到它的值为3452816845,预期的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::Entity(void)    {/*some internal array initialization*/}

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

我是否想念一些人?

3 个答案:

答案 0 :(得分:5)

您的类的数据成员未经初始化,因为您明确要求编译器保持未初始化状态。你这样做是通过编写一个默认的构造函数来做什么来初始化它们

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

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

Entity* entity = new Entity();

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

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

答案 1 :(得分: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)
}

答案 2 :(得分:3)

实际上,值3452816845(0xCDCDCDCD)是Microsoft运行时用于识别未初始化变量的特殊填充模式。编译器执行此操作,以便您可以检测何时忘记初始化变量,并将此值选为“良好”值,因为它不是有效地址,并且是无符号的大数字,以及“大”在签名范围内的负数,因此当您的代码使用其中一个值时,通常很容易注意到某些问题 - 它几乎总是超出您期望的范围。