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

Bra*_*ans 4 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));
        }
Run Code Online (Sandbox Code Playgroud)

我有Entity类的默认构造函数:

Entity::Entity(void)    {/*some internal array initialization*/}
Run Code Online (Sandbox Code Playgroud)

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

我错过了什么吗?

Mat*_*son 5

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


AnT*_*AnT 5

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

Entity::Entity(void) { /*some internal array initialization*/ }
Run Code Online (Sandbox Code Playgroud)

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

Entity* entity = new Entity();
Run Code Online (Sandbox Code Playgroud)

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

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