未初始化的 C++ 结构的行为

Posted

技术标签:

【中文标题】未初始化的 C++ 结构的行为【英文标题】:Behaviour of uninitialized C++ structs 【发布时间】:2021-03-27 11:08:53 【问题描述】:

假设我们在本地范围内声明了一个结构数组:

    int main()

    RandomStruct array [1000];

当前数组中的结构未初始化。虽然这意味着结构变量也未初始化,但这是否还意味着其他任何东西?例如,如果我将一个未初始化结构中的所有变量设置为所需的值,然后使用该结构的函数,或者如果我在设置它们之前使用不使用未初始化变量的结构的函数。我认为只有变量会未初始化并且数组所做的只是为每个结构的变量分配随机内存是正确的吗?

【问题讨论】:

"当前数组中的结构未初始化。" 调用结构的默认构造函数。 (结构的)包含变量未初始化,仅当默认构造函数未初始化它们时。 如果数组是本地的,为什么不应该调用默认构造函数? "你错了" 然而,我说“(结构的)包含变量是未初始化的,只有在默认构造函数没有初始化它们的情况下。”和默认由编译器生成的构造函数不会初始化它们。当您没有阅读他们写的所有内容时,请不要说人们错了。 @12123232 这似乎不是一个正确的表征。在这两种情况下,都会使用默认 ctor,它可能是编译器生成的,也可能是用户提供的,具体取决于您在编写实际结构定义时是否声明了一个 @12123232 "所以对于具有本地数组的结构,它们是由编译器生成的默认构造函数构造的" 不一定。这就是我写评论的原因。构造函数可能是用户提供的,它可以初始化包含的变量。如果不知道RandomStruct 是什么,就不可能知道它的成员值是否会被初始化。如果是,例如struct RandomStruct int a; RandomStruct () : a(-1) ; - a 将被初始化为 -1,每次,无论在哪里进行这种构造。 【参考方案1】:

目前数组中的结构体未初始化

不,他们是default-initialized。

虽然这意味着结构变量也未初始化

对成员的影响取决于RandomStruct 的定义。根据该定义,RandomStruct 的默认初始化可能会影响RandomStruct 的部分或全部非静态数据成员的默认初始化。它可能最终具有默认初始化非类类型变量的效果,如RandomStruct 的成员或成员的成员等。非类类型的变量将有一个不确定的值。

例如,如果我将未初始化结构中的所有变量设置为所需的值,然后使用该结构的函数,或者如果我在设置之前使用不使用未初始化变量的结构的函数

如果所有成员在使用前都初始化为确定值,则一切正常。不“观察”不确定值的成员函数调用是可以的。

我认为只有变量会未初始化并且数组所做的只是为结构的每个变量分配随机内存是正确的吗?

这并不完全正确。这意味着观察不确定的值是可以的,但它们的值是未知的。它不是。但只要你不观察这些值,这是一种有效的直觉。

只要不观察它们,就可以让它们不确定。但是,对于"observe" the indeterminate value,它是未定义的行为,通过在任何评估中产生它,除非在非常有限的枚举条件下。

这意味着不允许正确的程序观察该值,但编译器也不需要对其进行诊断。但是,编译器可以假设它永远不会完成(因为正确的程序无法做到)并且 C++ 对无效程序没有任何要求。

【讨论】:

以上是关于未初始化的 C++ 结构的行为的主要内容,如果未能解决你的问题,请参考以下文章

C++ 未初始化的结构成员 - 字段不存在

valgrind 抱怨 C++ 结构上的未初始化字节

复制具有未初始化成员的结构

C ++中未初始化的内存分配

C编译器如何处理使用未初始化的变量?

编译多个 C++,得到未初始化的向量