C++: 单例模式和缺陷
睿丰德科技 专注RFID识别技术和条码识别技术与管理软件的集成项目。质量追溯系统、MES系统、金蝶与条码系统对接、用友与条码系统对接
编译执行上面的代码,输出如下:
编译上面的代码并执行,输出如下:
C++: 单例模式和缺陷
实现一个单例模式
1class Singleton {2 private:3 Singleton() { cout << "Singleton::constructor" << endl; }4 ~Singlton() { cout << "Singleton::destructor" << endl; }5 Singleton(const Singleton&) {};6 Singleton &operator=(const Singleton&) {};7 public:8 static Singleton* getInstance() {9 if(m_aInstance == NULL) {10 m_aInstance = new Singleton();11 }12 return m_aInstance;13 }14 void show() {15 cout << "Singleton::show" << endl;16 }17 private:18 static Singleton* m_aInstance;19};2021Singleton* Singleton::m_aInstance = NULL;2223int main(int argc, char **argv) {24 Singleton* aSingleton = Singleton::getInstance();25 aSingleton->show(); 26 return 0;27}
Singleton::constructor Singleton::show我们发现上面的输出并没有调用到Singleton的虚构函数,Singleton的资源可能没有被释放。现在的问题是要怎么才能在程序退出的时候正确释放Singleton的资源。我们注意到这样一个事实:
系统会自动调用在栈和静态数据区上分配的对象的析构函数来释放资源。
修改程序如下:
1class Singleton {2 private:3 Singleton() { cout << "Singleton::constructor" << endl; }4 ~Singleton() { cout << "Singleton::destructor" << endl; }5 Singleton(const Singleton&) {};6 Singleton &operator=(const Singleton&) {};7 public:8 static Singleton* getInstance() {9 if(m_aInstance == NULL) {10 m_aInstance = new Singleton();11 }12 return m_aInstance;13 }14 void show() {15 cout << "Singleton::show" << endl;16 }1718 private:19 class Garbage{20 public:21 ~Garbage() {22 if(m_aInstance != NULL) {23 delete m_aInstance;24 }25 }26 };27 28 private:29 static Singleton* m_aInstance;30 static Garbage m_garbage;31};3233Singleton* Singleton::m_aInstance = NULL;34Singleton::Garbage Singleton::m_garbage;3536int main(int argc, char **argv) {37 Singleton* aSingleton = Singleton::getInstance();38 aSingleton->show(); 39 return 0;40}
Singleton::constructor Singleton::show Singleton::destructor
我们看到Singleton::destructor被明确的执行了。
相关阅读: 递归模板实现单例模式 RFID管理系统集成商 RFID中间件 条码系统中间层 物联网软件集成