网站首页 > 物联资讯 > 技术分享

C++: 单例模式和缺陷

2016-09-28 00:00:00 广州睿丰德信息科技有限公司 阅读
睿丰德科技 专注RFID识别技术和条码识别技术与管理软件的集成项目。质量追溯系统、MES系统、金蝶与条码系统对接、用友与条码系统对接

C++: 单例模式和缺陷

 

实现一个单例模式

1 class 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 }; 20   21 Singleton* Singleton::m_aInstance = NULL; 22   23 int main(int argc, char **argv) { 24     Singleton* aSingleton = Singleton::getInstance(); 25     aSingleton->show(); 26     return 0; 27 } 编译执行上面的代码,输出如下:

 

Singleton::constructor
Singleton::show
我们发现上面的输出并没有调用到Singleton的虚构函数,Singleton的资源可能没有被释放。现在的问题是要怎么才能在程序退出的时候正确释放Singleton的资源。我们注意到这样一个事实:

 

系统会自动调用在栈和静态数据区上分配的对象的析构函数来释放资源。

修改程序如下:

1 class 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         } 17   18     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 }; 32   33 Singleton* Singleton::m_aInstance = NULL; 34 Singleton::Garbage Singleton::m_garbage; 35   36 int 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中间件 条码系统中间层 物联网软件集成