当基本C++类型具有未知的初始值时

When do fundamental C++ types have an unknown initial value?

本文关键字:未知 C++ 类型      更新时间:2023-10-16

基本C++类型,如intfloat,何时会有未知的初始值?

内存分配类型是如何考虑的(如果有的话)?那宣言呢?如果它是class/struct/union的成员呢?C++11与C++03或C++98不同吗?

我有自己的怀疑,但不知道我的知识是否完整(或正确)

当两者都为时,任何POD数据(包括所有基本类型)都将具有未知值

  • 它没有静态内存分配(而是在堆栈上或使用new创建的)
  • 它未初始化,包括空的初始化和/或构造函数初始化列表

在调用main之前,作为启动过程的一部分,所有类型的全局/静态变量都设置为零。构造函数是为在main 1之前具有构造函数的类型调用的。

构造函数中未初始化的任何内容也是未知的。

编辑:为了澄清,std::string是"构造函数不初始化所有东西"的一个很好的例子——如果你有一个本地std::string str;,那么str将有一个定义的"空字符串"内容,但实际缓冲区的内容,或者实际上,缓冲区的点可能根本没有被设置为任何有意义的东西,因为一旦我们开始使用字符串来存储东西,实现可能会根据长度[或其他方式]来确定是否有可用的缓冲区]。

Edit2:正如注释所解释的,您也可以有"混合"情况,其中结构的某些部分正在初始化,例如struct,它包含一些"纯数据"元素和一些具有构造函数的元素。具有构造函数的将调用其构造函数。将不会初始化纯数据。

1运行构造函数的代码很可能是"main"函数的一部分,或者从"main"功能内部调用,但如果是这样的话,它将是"在main中的任何代码启动之前"。

摘自"C++工作草案,2012-11-02"

3.6.2非局部变量的初始化[basic.start.init]
2具有静态存储持续时间(3.7.1)或线程存储持续时间的变量(3.7.2)应初始化为零(8.5)在进行任何其他初始化之前。

具有静态存储的变量至少初始化了零。

3.7.3自动存储持续时间[basic.stc.auto]
2[注意:这些变量按照6.7中的描述进行初始化和销毁。--尾注]

6.7没有说明如何初始化自动变量。

3.7.4动态存储持续时间[basic.stc.Dynamic]

3.7.4.1分配函数[basic.stc.dynamic.Allocation]
…从分配函数。通过对分配函数未指定

8.5初始化程序[dcl.init]
7默认初始化T类型的对象意味着:
--如果T是一个(可能是cv限定的)类类型(第9条),则调用T的默认构造函数(并且如果T没有可访问的默认构造函数,则初始化是格式错误的)
--如果T是数组类型,则默认初始化每个元素
--否则,不执行初始化。

如果提供显式初始值设定项,则任何变量都将具有已知值。

如果没有为POD类型提供显式初始值设定项,则它取决于存储类。静态或线程变量将初始化为零,而自动或动态分配的变量则不会初始化。

如果你有一个复合类型,同样的规则适用。如果您没有显式初始值设定项,则通过(默认)构造函数或其他方式,基本类型的初始值取决于存储类。

最后,通过malloc分配的内存将被取消初始化,而calloc内存将被零初始化。