我多年没有使用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 ..
我是否想念一些人?
答案 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运行时用于识别未初始化变量的特殊填充模式。编译器执行此操作,以便您可以检测何时忘记初始化变量,并将此值选为“良好”值,因为它不是有效地址,并且是无符号的大数字,以及“大”在签名范围内的负数,因此当您的代码使用其中一个值时,通常很容易注意到某些问题 - 它几乎总是超出您期望的范围。