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

  • 相关阅读:
    2016工作总结与反思
    JSP 标准标签库(JSTL)
    JQuery遍历CheckBox踩坑记
    JAVA中按照""截取字符串
    file上传图片功能
    List转化为Map
    Map转化为List
    对JAVA的LIST进行排序
    根据制定ID查询信息
    制定查询条数
  • 原文地址:https://www.cnblogs.com/lidabo/p/3701101.html
Copyright © 2020-2023  润新知