2. 静态存储周期 (static storage duration)#
说明#
对于静态存储周期的对象, 它在第一次从运行到它的定义时被构造, 在 程序结束时 销毁. 因此即使多次运行到, 也只会构造一次.
1void function() {
2 static Noisy c1{Info{.ctor = "0", .dtor = "1"}};
3 Noisy c2{Info{.ctor = "2", .dtor = "3"}};
4}
5
6int main() {
7 function();
8 function();
9}
10// 最终输出
11// 0: 第一次调用时, c1 构造
12// 2: 第一次调用时, c2 构造
13// 3: 第一次调用时, c2 析构
14// 2: 第二次调用时, c2 构造
15// 3: 第二次调用时, c2 析构
16// 1: 程序结束时, c1 析构
程序在执行完 main
函数后, 才对静态存储周期对象进行销毁. 因此, 它的析构晚于 main
函数中的自动存储周期对象.
1int main() {
2 Noisy c1{Info{.ctor = "0", .dtor = "1"}};
3 static Noisy c2{Info{.ctor = "2", .dtor = "3"}};
4}
5// 最终输出
6// 0: c1 构造
7// 2: c2 构造
8// 1: c1 析构
9// 3: c2 析构
如果有多个静态存储周期对象要销毁, 它们将按构造的相反顺序销毁.
1int main() {
2 { static Noisy c1{Info{.ctor = "0", .dtor = "1"}}; }
3 static Noisy c2{Info{.ctor = "2", .dtor = "3"}};
4}
5// 最终输出
6// 0: c1 构造
7// 2: c2 构造
8// 3: c2 析构
9// 1: c1 析构
全局变量也是静态存储周期, 它在程序开始、进入 main
函数之前被构造, 在程序结束时被销毁.
1Noisy c1{Info{.ctor = "0", .dtor = "1"}};
2
3int main() {
4 Noisy c2{Info{.ctor = "2", .dtor = "3"}};
5}
6// 最终输出
7// 0: 程序开始时, c1 构造
8// 2: c2 构造
9// 3: c2 析构
10// 1: 程序结束时, c1 析构
类模板、函数模板实例化后可能是不同的类、函数, 则有不同的静态局部变量.
1template <typename T>
2void function() {
3 static Noisy c1{Info{.ctor = "0", .dtor = "1"}};
4}
5
6int main() {
7 function<int>();
8 function<double>();
9 function<int>();
10}
11// 最终输出
12// 0: function<int>::c1 构造
13// 0: function<double>::c1 构造
14// 1: function<double>::c1 析构
15// 1: function<int>::c1 析构
参见
实例化: 对类模板写友元函数出现问题? (instantiation) 中解释了模板的实例化.
题目#
题 1#
1int main() {
2 static Noisy c1{Info{.ctor = "v", .dtor = "r"}};
3 {
4 static Noisy c2{Info{.ctor = "e", .dtor = "o"}};
5 }
6 static Noisy c3{Info{.ctor = "c", .dtor = "t"}};
7}
点击查看提示
6 个字符. 标准库中可变长度的数组.
点击查看答案
[在线代码 9z4oW8cW1], 答案: vector
.
题 2#
1void function(Noisy const& noisy) {
2 static Noisy c1 = noisy;
3}
4
5Noisy c1{Info{.ctor = "d", .copy_ctor = "m", .dtor = "r"}};
6
7int main() {
8 {
9 static Noisy c2{Info{.ctor = "o", .copy_ctor = "l", .dtor = "o"}};
10 function(c1);
11 {
12 static Noisy c3{Info{.ctor = "a", .dtor = "r"}};
13 }
14 static Noisy c4{Info{.ctor = "i", .dtor = "e"}};
15 function(c2);
16 }
17
18 static Noisy c6{Info{.ctor = "n", .dtor = "_"}};
19}
点击查看提示
12 个字符. 输入的参数超出函数的定义域时使用的标准库异常.
点击查看答案
[在线代码 ojr7q5Ync], 答案: domain_error
.
题 3#
1int main() {
2 {
3 {
4 static Noisy c1{Info{.ctor = "i", .dtor = "t"}};
5 }
6 static Noisy c2{Info{.ctor = "n", .dtor = "n"}};
7 }
8 {
9 {
10 static Noisy c3{Info{.ctor = "v", .dtor = "e"}};
11 }
12
13 static Noisy c4{Info{.ctor = "a", .dtor = "m"}};
14 {
15 static Noisy c5{Info{.ctor = "l", .dtor = "u"}};
16 {
17 static Noisy c6{Info{.ctor = "i", .dtor = "g"}};
18 }
19 static Noisy c7{Info{.ctor = "d", .dtor = "r"}};
20 }
21 static Noisy c8{Info{.ctor = "_", .dtor = "a"}};
22 }
23}
点击查看提示
16 个字符. 输入的参数不能被函数接受时使用的标准库异常.
点击查看答案
[在线代码 3rvhE1vrr], 答案: invalid_argument
.