C++ 单例 Meyers' Singleton(迈耶斯单例)

Meyers' Singleton(迈耶斯单例)是 C++ 中实现单例模式的一种简洁高效的方法,由 C++ 专家 Scott Meyers 提出。其核心原理是利用局部静态变量的初始化特性保证单例的唯一性和线程安全性(C++11 及以后标准)。

1、核心原理

  1. 局部静态变量的初始化特性
    在 C++ 中,函数内的局部静态变量会在第一次调用该函数时初始化,且仅初始化一次。Meyers' Singleton 正是利用这一特性,将单例实例定义为静态成员函数中的局部静态变量,确保实例只被创建一次。

  2. 线程安全性(C++11 及以后)
    C++11 标准规定:局部静态变量的初始化是线程安全的,即多个线程同时首次调用函数时,初始化操作会被正确序列化(只有一个线程执行初始化,其他线程等待),无需额外的同步机制。

2、实现代码

#include <iostream>

class Singleton {
private:
    // 1. 私有构造函数:禁止类外创建对象
    Singleton() {
        std::cout << "Singleton 实例创建" << std::endl;
    }

    // 2. 禁用拷贝构造和拷贝赋值(避免复制实例)
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

    // 3. 禁用移动构造和移动赋值(C++11 及以后)
    Singleton(Singleton&&) = delete;
    Singleton& operator=(Singleton&&) = delete;

public:
    // 4. 静态成员函数:返回唯一实例(局部静态变量)
    static Singleton& getInstance() {
        static Singleton instance;  // 局部静态变量,首次调用时初始化
        return instance;
    }

    // 示例成员函数
    void doSomething() {
        std::cout << "Singleton 执行操作" << std::endl;
    }
};

3、关键细节解析

  1. 私有构造函数
    构造函数被声明为 private,确保外部无法通过 new 或直接定义对象的方式创建实例,只能通过类提供的接口(getInstance())获取实例。

  2. 禁用拷贝和移动
    通过 = delete 显式禁用拷贝构造函数、拷贝赋值运算符、移动构造函数和移动赋值运算符,防止通过复制或移动现有实例创建新对象,保证唯一性。

  3. 静态成员函数 getInstance()
    这是获取单例实例的唯一接口,其内部定义的局部静态变量 instance 会在第一次调用 getInstance() 时初始化,且后续调用不再重复初始化,确保全局只有一个实例。

  4. 实例的生命周期
    局部静态变量 instance 的生命周期从首次初始化开始,直到程序结束时自动销毁,无需手动管理内存(避免了动态分配导致的内存泄漏风险)。

4、总结

Meyers' Singleton 利用 C++ 局部静态变量的初始化特性,以极简的代码实现了线程安全(C++11+)、自动销毁、全局唯一的单例模式。其核心是通过 getInstance() 函数返回局部静态变量的引用,确保实例在第一次使用时初始化且仅初始化一次,是工业界广泛采用的单例方案。

posted @ 2025-09-16 22:19  xclic  阅读(67)  评论(0)    收藏  举报