C++面试题更新 2026-08-05

请阐述在 C++ 语言中,实现单例模式的具体方法有哪些,并讨论各自的特点。

技术原理方案权衡C++

考察说明

考查对 C++ 中单例模式多种实现方式及其线程安全、性能等特性的理解。

回答思路

  1. 【回答框架 1】单例模式是一种创建型设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在 C++ 中,常见实现有饿汉式、懒汉式、双重检查锁定(DCLP)和 Meyers' Singleton(局部静态变量)。
  2. 【回答框架 2】饿汉式在类加载时就创建实例,线程安全,但可能造成资源浪费。懒汉式在首次使用时创建实例,非线程安全,需要加锁。双重检查锁定通过先判断实例是否为空,再加锁,避免每次获取都加锁,但需要正确处理内存屏障,否则可能出现指令重排序问题。
  3. 【回答框架 3】Meyers' Singleton 利用 C++11 之后局部静态变量初始化的线程安全性,代码简洁且线程安全,是推荐做法。在 C++11 之前,没有此保证,需要额外处理。
  4. 【回答框架 4】此外,还要考虑单例的生命周期管理,例如如何在程序退出时正确销毁实例,可以使用智能指针或提供显式销毁函数。
  5. 【回答框架 5】实际开发中,应优先使用 Meyers' Singleton,除非有特殊需求(如需要延迟初始化且无法使用局部静态变量),并注意避免过度使用单例,因为它会引入全局状态,增加耦合,不利于测试和维护。
  6. 【关键点 1】饿汉式线程安全但可能浪费资源;懒汉式需要同步控制。
  7. 【关键点 2】双重检查锁定需注意内存屏障和指令重排序问题。
  8. 【关键点 3】Meyers' Singleton 依赖 C++11 局部静态变量线程安全初始化,最推荐。
  9. 【关键点 4】单例对象销毁时机需谨慎处理,防止资源泄漏。
  10. 【关键点 5】单例模式会引入全局状态,应谨慎使用。
  11. 【易错点 1】双重检查锁定在 C++11 之前不可靠,因为无内存屏障保证。
  12. 【易错点 2】不要忘记实现拷贝构造函数和赋值运算符为私有或删除,防止复制单例。
  13. 【易错点 3】过度依赖单例导致代码耦合度高,难以单元测试。