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

  • 相关阅读:
    Javascript中怎么定义类(私有成员、静态成员)?
    Web前端国内的叫法与行业归类吗
    CSS hack,CSS简写,CSS定义应注意的几个问题
    7个在IE和Firefox中不同的JavaScript语法
    IE和Firefox中的事件
    IE8的css hack /9
    CSS hack
    运行,复制,保存,runCode,copyCode,saveCode,运行代码框
    自由使用层的叠加
    WordPress自定义URL的Rewrite规则
  • 原文地址:https://www.cnblogs.com/lidabo/p/3701101.html
Copyright © 2020-2023  润新知