• 关于C++单件模式释放对象


    http://blog.csdn.net/windboyzsj/article/details/2790485

    最近接触的一个项目要用到单件模式,我像往常一样哒哒(敲击键盘ing)一个单件模式的典型结构很快就出现在我的面前: 

    1. class Singleton 
    2. public: 
    3. ~Singleton(){} 
    4. static Singleton* Instance() 
    5.   if (_instance == NULL) 
    6.   { 
    7.    _instance = new Singleton(); 
    8.   } 
    9.   return _instance; 
    10. private: 
    11. Singleton(){} 
    12. static Singleton* _instance; 
    13. }; 
    14. Singleton* Singleton::_instance = NULL;

    不知道为什么,这次突然觉得new这个单词太耀眼了,熟悉c++的程序员都知道,有new就离不开delete,既然单件模式共用一个实例,那么这个实例什么时候释放呢。带着好奇我在它的析构函数加了个打印语句,但由于new操作是在堆里分配内存,估计它的析构函数不会被调用,而试验结果确实如此。这样一来那单件模式的析构函数不是完全废了吗,如果这个单件类还有指针成员用new分配了空间那又应该在哪里释放?单件的实例又应该如何释放。当然,我们可以在程序退出时通过 delete Singleton::Instance(); 来释放内存并触发析构函数。但这样一来,写好的类给别人用时就要叮嘱别人,用完后一定要释放- - !,再说别人不一定记得...有没有一种机制让单件模式自动释放?百度,google很久,发现关注这个问题的寥寥无几,但还是给我找到了一篇文章让我再次领略C++的灵活。按此文章大概把代码修改如下; 

    1. class Singleton 
    2. public: 
    3. ~Singleton(){} 
    4. static Singleton* Instance() 
    5.   if (_instance == NULL) 
    6.   { 
    7.    _instance = new Singleton(); 
    8.   } 
    9.   return _instance; 
    10. private: 
    11. Singleton(){} 
    12. static Singleton* _instance; 
    13. class Cleaner 
    14. public: 
    15.   Cleaner(){} 
    16.   ~Cleaner() 
    17.   { 
    18.    if(Singleton::Instance()) 
    19.    delete Singleton::Instance(); 
    20.   } 
    21. }; 
    22. static Cleaner clr; 
    23. }; 
    24. Singleton* Singleton::_instance = NULL; 

    事先声明我用VC6.0编译上面的代码(当然我有加一些测试代码)发现,clr并没有实例化,当然也就是没有析构了,暂时不清楚为什么,但这里的设计却是很值得品味。它通过一个内嵌类和一个静态成员来实现了自动释放的机制,相当于为单件加了个垃圾回收器。整个设计最巧妙的地方在于static Cleaner clr;这个声明,由于是静态成员,系统会在栈里分配内存,回收工作也就由系统自动完成了。这个思路另我想起了通过静态变量来实现类的静态构造函数,他们都有异曲同工之处。至于私有的内嵌类主要是防止单件类的专用垃圾筒被打扰... 

    虽然上面代码没有达到目的,但根据他的思路,可以做一下调整,把Cleaner的实例化延迟,下面贴出整个测试代码,一下代码在VC6编译通过。 

    1. #include <iostream.h> 
    2. class Singleton 
    3. public: 
    4. ~Singleton(){cout<<"singleton deconstruct"<<endl;} 
    5. static Singleton* Instance() 
    6.   if (_instance == NULL) 
    7.   { 
    8.    _instance = new Singleton(); 
    9.    static Cleaner cl; //延迟到这里 
    10.   } 
    11.   return _instance; 
    12. void Print(char* str) 
    13.   cout<<"singleton print:"<<str<<endl; 
    14. private: 
    15. Singleton(){cout<<"singleton construct"<<endl;} 
    16. static Singleton* _instance; 
    17. class Cleaner 
    18. public: 
    19.   Cleaner(){cout<<"cleaner construct"<<endl;} 
    20.   ~Cleaner() 
    21.   { 
    22.    cout<<"cleaner deconstruct"<<endl; 
    23.    if(Singleton::Instance()) 
    24.    delete Singleton::Instance(); 
    25.   } 
    26. }; 
    27. }; 
    28. Singleton* Singleton::_instance = NULL; 
    29. int main(int argc, char* argv[]) 
    30. Singleton::Instance()->Print("print 1"); 
    31. Singleton::Instance()->Print("print 2"); 
    32. return 0; 
    33. }
  • 相关阅读:
    数组与方法
    数据类型
    认识Java(2)
    认识Java(1)
    面试题集锦
    00-python语言介绍
    06-python-生成器、循环器
    00-python-内置函数笔记
    04-python-闭包
    03-python-装饰器
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/4127450.html
Copyright © 2020-2023  润新知