Ste*_*sop 13
存储持续时间是四个字之一:
而已.它告诉您什么时候适用于创建和销毁对象的规则.
生命周期是程序运行时的一部分,在此期间对象可用.通常这是从构造到破坏,但是对于普通类型(没有构造函数或析构函数的类型),它"从分配内存到内存被释放或用于另一个对象".
所以这两者是相关的,但它们并不完全相同.具有不同存储持续时间的两个对象可以具有相关且几乎相同的寿命(例如,unique_ptr它管理的自动和动态对象),并且具有相同存储持续时间的两个对象可以具有完全不同的寿命(尤其是两个动态对象).
你走进一家麦当劳,看到一份菜单。菜单上有许多不同的项目,包括巨无霸、四分之一磅奶酪、热苹果派和令人作呕的菲力鱼。
你走到柜台点了一个巨无霸。您会看到一个 3 层面包、2 个“全牛肉”馅饼和一些特制酱汁,所有这些都封装在一张纸中。
你身后的人点了同样的东西,他们得到了自己的汉堡。你们俩坐下开始吃饭。你吃的很快,但你的邻居几乎不碰他的。
排队的第三个人点了 Apple Pie,他们得到了完全不同的东西。一个小小的半圆柱形糕点,里面装满了类似苹果的东西。
在这个类比中,菜单上的打印是存储持续时间,而汉堡本身的类型类似于对象的生命周期。选择了两种不同的储存期限;巨无霸和苹果派。结果产生了三个物体:两个汉堡和一个糕点。其中两个对象具有相同的总体构成,即使它们是两个不同的汉堡,但第三个是不同的。两个存储持续时间,三个对象。
您的报价:
对象的生命周期等于或嵌套在其存储的生命周期内。
是不是定义为“寿命”或“存储时间”,而仅仅涉及两个。它告诉您,给定 X 的“存储持续时间”,您可以预期 Y 的生命周期。
从这个意义上说,这两个术语实际上是同一枚硬币的两面。特定的存储持续时间产生特定的寿命。
这在 (C++03) 标准中有详细说明:
1/对象的生命周期是对象的运行时属性。类型 T 的对象的生命周期在以下情况下开始: — 获得了类型 T 具有正确对齐和大小的存储,并且 — 如果 T 是具有非平凡构造函数 (12.1) 的类类型,则构造函数调用已完成。类型 T 的对象的生命周期在以下情况下结束: — 如果 T 是具有非平凡析构函数的类类型 (12.4),则析构函数调用开始,或者 — 对象占用的存储空间被重用或释放。
1/存储持续时间是一个对象的属性,它定义了包含该对象的存储的最小潜在生命周期。存储持续时间由用于创建对象的构造决定,并且是以下之一: — 静态存储持续时间 — 自动存储持续时间 — 动态存储持续时间