静态初始化和动态初始化
Example Static and Dynamic Initialization
是否存在静态和动态两种方式初始化变量的例子?如规范所述。
静态初始化应在任何动态初始化之前执行初始化开始。
我假设变量可以在同一个程序中以静态和动态方式初始化。尽管我认为,那个初始化是一个初值的定义。
当然:静态初始化将在任何用户代码运行之前用零填充所有对象。
这些零可能在执行其他初始化式时可见。阅读"静态初始化顺序失败"
注意,在动态初始化完成之前,对象不会被认为是构造的,并且必须遵循生命周期规则。标准中的[basic.life]
规定:
对象的生存期是该对象的运行时属性。如果对象是类类型或聚合类型,并且它或它的一个成员是由普通默认构造函数以外的构造函数初始化的,则该对象被称为具有非平凡初始化。[注:普通复制/移动构造函数的初始化是非普通初始化。]
T
类型对象的生存期从以下时刻开始:获得了适合
T
类型的正确对齐和大小的- 存储器,并且
- 如果对象具有非平凡初始化,则表示该对象初始化完成。
和
本国际标准中赋予对象的属性仅在给定对象的生命周期内适用。[注意:特别是在对象生命周期开始之前和结束之后,对象的使用有明显的限制,如下12.6.2和12.7所述。]此外,正在构造和销毁的对象的行为可能与生命周期已经开始但尚未结束的对象的行为不同。12.6.2和12.7描述了对象在构造和销毁阶段的行为。
和
同样,在对象的生命周期开始之前,在对象将占用的存储空间被分配之后,或者在对象的生命周期结束之后,在对象所占用的存储空间被重用或释放之前,任何指向原始对象的glvalue都可以被使用,但只能以有限的方式使用。对于正在构建或销毁的对象,请参见12.7。否则,这样的glvalue指的是已分配的存储(3.7.4.2),并且使用不依赖于其值的glvalue属性是定义良好的。如果:
程序有未定义的行为
- 左值到右值的转换(4.1)应用于这样的glvalue,
- glvalue用于访问非静态数据成员或调用对象的非静态成员函数,或者
- glvalue绑定到虚基类(8.5.3)的引用,或者
- glvalue用作
dynamic_cast
(5.2.7)的操作数或typeid
的操作数。
因此,访问非基本类型对象的(归零)内容很容易导致未定义的行为。
- 内联映射初始化的动态atexit析构函数崩溃
- 动态初始化 C 与 C++ 中的静态值
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- 静态和动态模板初始化可以交错吗?
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- C++ - 使用类中的初始值设定项列表初始化动态集
- 异常 尝试初始化动态数组时未处理
- 如何使用initializer_ist在构造函数中初始化动态数组
- 如何在类中初始化动态数组
- 如何使用一些参数初始化动态分配的数组中的对象
- 初始化动态分配的数组时出错
- 使用对象的复制构造函数初始化动态数组对象
- 初始化动态数组
- 通过已存在的对象初始化动态分配的对象
- c++初始化动态内存中c样式字符串的默认值
- 如何在c++中以非标准方式初始化动态内存
- 初始化动态字符串数组(c++)
- 如何使用memset初始化动态二维数组
- 初始化动态向量列表
- 特征:逗号初始化动态矩阵