zoukankan      html  css  js  c++  java
  • C++: 单例模式和缺陷

    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被明确的执行了。

  • 相关阅读:
    java如何导入Excel文件
    C/S框架设计经验小结
    WebClient以POST方式发送Web请求
    如何自动拼接 Update语句,仅Update已修改的字段
    DataGridView如何快速导出Excel
    【转】基于STM32F103内部AD测量电池电压
    【转】stm8 rtc时钟
    【转】NiOS II从EPCQ256的自启动设置
    【转】验收代码寄存器和验收屏蔽寄存器
    【转】eclipse : Type Symbol 'xxx' could not be resolved 解决办法
  • 原文地址:https://www.cnblogs.com/lidabo/p/3701101.html
Copyright © 2011-2022 走看看