c++如何实现单例模式 设计模式在c++中的应用【进阶必看】

admin 百科 14
C++单例模式推荐使用C++11局部静态变量实现,线程安全且懒加载;需传参或控制销毁时机时用指针+双重检查锁;模板化CRTP基类可复用,但不支持参数构造;避免老式懒汉、饿汉及宏实现。

c++如何实现单例模式 设计模式在c++中的应用【进阶必看】-第1张图片-佛山资讯网

单例模式在 C++ 中的核心目标是:确保一个类只有一个实例,并提供全局访问点。关键难点在于线程安全、懒加载、析构时机和模板复用。下面从实用角度讲清几种主流实现方式及其适用场景。

最简线程安全的懒汉式(C++11 及以后)

C++11 标准保证了 局部静态变量的初始化是线程安全的,这是最推荐的现代写法,无需手动加锁,也天然支持懒加载:

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // 仅首次调用时构造,且线程安全
        return instance;
    }
<pre class="brush:php;toolbar:false;">Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

登录后复制

private: Singleton() = default; // 构造函数私有 ~Singleton() = default; // 析构函数私有(可选,若需控制销毁时机则留 public) };

✅ 优点:简洁、安全、高效、自动管理生命周期
⚠️ 注意:析构发生在 main() 返回后、全局对象销毁阶段;若其他静态对象依赖该单例,可能引发“静态析构顺序问题”。

带显式初始化控制的单例(适用于需延迟构造参数或避免静态析构风险)

当单例构造需要运行时参数,或你希望完全掌控创建/销毁时机(比如游戏引擎中模块按需启停),可用指针 + 懒加载 + 手动管理:

class ConfigManager {
public:
    static ConfigManager& getInstance() {
        if (!instance) {
            std::lock_guard<std::mutex> lock(mutex_);
            if (!instance) {
                instance = new ConfigManager("config.json");
            }
        }
        return *instance;
    }
<pre class="brush:php;toolbar:false;">static void destroy() {
    std::lock_guard<std::mutex> lock(mutex_);
    delete instance;
    instance = nullptr;
}

登录后复制

private: ConfigManager(const std::string& cfgPath) { / 加载配置 / } ~ConfigManager() = default;

static ConfigManager* instance;
static std::mutex mutex_;

登录后复制

};

立即学习“C++免费学习笔记(深入)”;

标签: js json 懒加载 ai c++ 作用域

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~