可移植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
相关产品推荐
相关产品推荐

