#include <iostream>using namespace std;class Singleton {private:Singleton() {cout << "Constructor Called" << endl;}public:Singleton(Singleton &) = delete;Singleton &operator=(Singleton &) = delete;~Singleton() {cout << "Destructor Called" << endl;}static Singleton &Instance() {// 注意返回引用// 使用local static对象替换non-local static对象static Singleton singleton;return singleton;}};int main() {cout << "main begin" << endl;Singleton &s1 = Singleton::Instance();cout << "1" << endl;Singleton &s2 = Singleton::Instance();cout << "2" << endl;Singleton &s3 = s1;cout << "main end" << endl;return 0;}
输出
可见构造函数只调用了一次,并且local static的初始化是在第一次执行到其声明式时,生命周期维持到程序结束。
并且该方法在c++11之后是线程安全的!!!
If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization. 如果当变量在初始化的时候,并发同时进入声明语句,并发线程将会阻塞等待初始化结束。
