定义
- 生命周期 (Lifetime):
- 在 C++ 中,一个对象的生命周期始于存储空间被成功分配/复用,并且对象的类型已被确定的时候。
- 对于许多类型而言,生命周期始于对象的创建(例如,通过定义、
new表达式等)。 - 对于拥有平凡 (trivial) 析构函数的类型(如
int,double, C 风格数组,或简单结构体),对象的生命周期可能在其存储空间被复用时就开始了,早于其实际的初始化或值赋予。
- 初始化时间 (Initialization Time):
- 这是给对象赋予一个初始值或调用构造函数的时间。
- 对于非平凡类型,初始化(构造函数调用)通常标志着生命周期的开始。
- 但对于平凡类型,对象可能在初始化之前就已经存在于内存中,并且其生命周期已经开始。
简单来说:一个对象可能已经“活”在内存里了,但还没被“赋值”或“构造”。“占据空间”是生命周期的起点,而“获得第一个合法值”是初始化。
例子
函数内部局部静态变量
单例模式通常会有这样的代码:
// Logger.h
#include <string>
#include <iostream>
class Logger {
public:
// 1. 获取单例实例的静态方法
static Logger& getInstance() {
static Logger instance; // C++11 保证线程安全地初始化
return instance;
}
...
};对于 instance 对象,它的初始化时间是在函数首次执行的时候,但是生命周期是程序整个运行期间。因为内存是在程序启动时分配好的,并在程序终止时释放,所以它是 静态存储期。
写在最后
以前在考虑生命周期的时候,通常都是考虑变量出作用域了,这时初始化时间就是生命周期的起点,造成了误解——“初始化时间是生命周期的起点”。