You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

可移植C++线程安全单例:析构函数何时被调用?

C++11线程安全单例的析构时机问题

你提到的这个C11线程安全单例实现确实是目前公认的可移植且正确的方案——毕竟Anthony Williams在《C Concurrency in Action》里也专门认可了这种基于static局部变量的实现方式,它不仅天然保证了线程安全(C++11标准规定静态局部变量的初始化是线程安全的),还避开了传统单例模式的诸多陷阱。

先再贴出你给出的代码方便参考:

头文件代码

class Singleton final {
public:
    static Singleton& getInstance();
private:
    Singleton() = default;
    Singleton(Singleton const&) = delete;
    void operator=(Singleton const&) = delete;
};

实现代码

Singleton& Singleton::getInstance() {
    static Singleton instance;
    return instance;
}

回到你的核心问题:这个单例的析构函数何时被调用?

答案很明确,它遵循C++中静态对象的析构规则:

  • 这个static Singleton instance属于函数内的静态局部对象,它的析构会在程序正常退出阶段(也就是main()函数执行完毕之后)被触发。
  • 具体执行顺序是:所有全局对象、静态对象的析构会按照它们构造顺序的逆序来执行。举个例子,如果这个单例是整个程序中第一个被构造的静态对象,那它会是最后一个被析构的。

还有个细节需要注意:只有当程序是正常终止(比如通过return退出main、调用标准库的exit()函数)时,这个析构函数才会被执行;如果程序是异常终止(比如调用abort()、收到SIGKILL这类致命信号),操作系统会直接终止进程,不会执行对象的析构逻辑。

内容的提问来源于stack exchange,提问作者Sonic78

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:33:22