3. 动态存储周期 (dynamic storage duration)

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}

题 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}

题 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}