3. 动态存储周期 (dynamic storage duration)#
说明#
对于动态存储周期的对象, 它在运行到 new
时被构造, 在运行到 delete
时被销毁.
1int main() {
2 Noisy* c1 = new Noisy{Info{.ctor = "0", .dtor = "1"}};
3 Noisy* c2 = new Noisy{Info{.ctor = "2", .dtor = "3"}};
4 delete c1;
5 delete c2;
6}
7// 最终输出
8// 0: c1 构造
9// 2: c2 构造
10// 1: c1 析构
11// 3: c2 析构
如果不 delete
则动态存储周期对象不会被销毁, 将会发生内存泄露.
1int main() {
2 Noisy* c1 = new Noisy{Info{.ctor = "0", .dtor = "1"}};
3} // 指针本身为自动存储周期而析构, 它指向的对象为动态存储周期而泄露
4// 最终输出
5// 0: c1 构造
题目#
题 1#
1int main() {
2 Noisy* c1 = new Noisy{Info{.ctor = "s", .dtor = "o"}};
3 Noisy* c2 = nullptr;
4 c2 = new Noisy{Info{.ctor = "t", .dtor = "l"}};
5 delete c1;
6 Noisy* c3 = new Noisy{Info{.ctor = "i", .dtor = "u"}};
7 c2 = c3;
8}
点击查看提示
4 个字符. 将 std::string
转换为对应 int
类型的方法.
点击查看答案
[在线代码 s6MG9b9Wq], 答案: stoi
.
题 2#
1int main() {
2 {
3 Noisy* c1 = nullptr;
4 c1 = new Noisy{Info{.ctor = "o", .dtor = "a"}};
5 Noisy* c2 = new Derived_noisy{Info{.ctor = "s", .dtor = "n"},
6 Derived_info{.ctor = "t", .dtor = "i"}};
7 Noisy* c3 = nullptr;
8 {
9 c3 = new Noisy{Info{.ctor = "r", .dtor = "b"}};
10 c3 = c2;
11 delete c2;
12 }
13 Noisy* c4 = nullptr;
14 }
15 Noisy* c5 = nullptr;
16 Noisy* c6 = nullptr;
17 Noisy* c7 = new Noisy{Info{.ctor = "g", .dtor = "q"}};
18 {
19 c5 = new Noisy{Info{.ctor = "s", .dtor = "n"}};
20 Noisy* c8 = new Noisy{Info{.ctor = "t", .dtor = "u"}};
21 }
22 {
23 Noisy* c9 = new Noisy{Info{.ctor = "r", .dtor = "o"}};
24 c6 = new Noisy{Info{.ctor = "e", .dtor = "a"}};
25 }
26 delete c6;
27 Noisy* c10 = new Noisy{Info{.ctor = "m", .dtor = "p"}};
28}
点击查看提示
13 个字符. 像 cout
一样使用, 但是将输出结果存储为 string
的类.
点击查看答案
[在线代码 d9vjff7xx], 答案: ostringstream
.
题 3#
1int main() {
2 {
3 Noisy c1{
4 Info{.ctor = "s", .copy_ctor = "u", .copy_assign = "s", .dtor = "l"}};
5 Noisy* c2 = new Noisy{
6 Info{.ctor = "s", .copy_ctor = "o", .copy_assign = "t", .dtor = "r"}};
7 Noisy* c3 = nullptr;
8 c1 = *c2;
9 }
10 Noisy* c4 = new Noisy{Info{.ctor = "e", .dtor = "y"}};
11 Noisy c5{Info{.ctor = "a", .dtor = "m"}};
12 Noisy* c6 = nullptr;
13}
点击查看提示
7 个字符. 上一题答案所要用的头文件.
点击查看答案
[在线代码 G61bEMeTa], 答案: sstream
.