当基本C++类型具有未知的初始值时
When do fundamental C++ types have an unknown initial value?
基本C++类型,如int
或float
,何时会有未知的初始值?
内存分配类型是如何考虑的(如果有的话)?那宣言呢?如果它是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
内存将被零初始化。
- 继承期间显示未知行为的子类
- 输入中的字符串数未知(以字母表示)
- 具有未知值时的时间复杂性
- 链表中写入访问冲突的未知原因
- 正在生成未知类实例
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 读取文件时运行时的未知行为
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 初始化多个未知基类
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何存储未知次数迭代的输入?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 编译 Boost 时在 OS X 上的"ld:未知选项:-soname"
- 未知的 CMake 命令"create_single_source_cgal_program"
- 如何在C++中循环访问未知对象方法?
- Coursera :自动评分器的未知信号 11
- 即使直接从官方示例中复制,也找不到未知类型名称QML_ELEMENT和 QML 模块
- 未知的 GCC 链接器错误,但已成功构建
- 如何从未知视图中声明范围::v3::View 变量
- std::string.size() 未知行为