4

一个基本的 C++ 类型,比如intor float,什么时候会有一个未知的初始值?

如果有的话,内存分配的类型如何影响?宣言呢?如果它是class/ struct/的成员union怎么办?C++11 与 C++03 或 C++98 有什么不同?

我有我的怀疑,但不知道我的知识是否完整(或正确,就此而言)

4

2 回答 2

7

任何POD数据(包括所有基本类型)在以下情况下都将具有未知值:

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

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

任何未在构造函数中初始化的东西也是未知的。

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

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

1运行构造函数的代码很可能是“main”函数的一部分或从“main”函数内部调用 - 但如果是这种情况,它将是“在 main 中的任何代码启动之前”。

于 2013-02-08T22:17:41.037 回答
2

来自“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 Initializers [dcl.init]
7 对 T 类型的对象进行默认初始化意味着:
— 如果 T 是(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(并且初始化错误- 如果 T 没有可访问的默认构造函数,则形成);
— 如果 T 是数组类型,则每个元素都是默认初始化的;
— 否则,不执行初始化。

如果您提供显式初始化程序,则任何变量都将具有已知值。

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

如果您有复合类型,则适用相同的规则。如果您没有显式初始化程序,通过(默认)构造函数或其他方式,基本类型的初始值取决于存储类。

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

于 2013-02-08T22:40:27.847 回答