定义

  • 生命周期 (Lifetime)
    • 在 C++ 中,一个对象的生命周期始于存储空间被成功分配/复用,并且对象的类型已被确定的时候。
    • 对于许多类型而言,生命周期始于对象的创建(例如,通过定义、new 表达式等)。
    • 对于拥有平凡 (trivial) 析构函数的类型(如 intdouble, C 风格数组,或简单结构体),对象的生命周期可能在其存储空间被复用时就开始了,早于其实际的初始化或值赋予。
  • 初始化时间 (Initialization Time)
    • 这是给对象赋予一个初始值调用构造函数的时间。
    • 对于非平凡类型,初始化(构造函数调用)通常标志着生命周期的开始。
    • 但对于平凡类型,对象可能在初始化之前就已经存在于内存中,并且其生命周期已经开始。

简单来说:一个对象可能已经“活”在内存里了,但还没被“赋值”或“构造”。“占据空间”是生命周期的起点,而“获得第一个合法值”是初始化。

例子

函数内部局部静态变量

单例模式通常会有这样的代码:

// Logger.h
 
#include <string>
#include <iostream>
 
class Logger {
public:
    // 1. 获取单例实例的静态方法
    static Logger& getInstance() {
        static Logger instance; // C++11 保证线程安全地初始化
        return instance;
    }
...
};

对于 instance 对象,它的初始化时间是在函数首次执行的时候,但是生命周期是程序整个运行期间。因为内存是在程序启动时分配好的,并在程序终止时释放,所以它是 静态存储期

写在最后

以前在考虑生命周期的时候,通常都是考虑变量出作用域了,这时初始化时间就是生命周期的起点,造成了误解——“初始化时间是生命周期的起点”。