当前位置: 首页 > news >正文

建和做网站/杭州seo公司服务

建和做网站,杭州seo公司服务,乐清市住房和城乡规划建设局网站,网站开发群http://blog.csdn.net/windboyzsj/article/details/2790485 最近接触的一个项目要用到单件模式,我像往常一样哒哒(敲击键盘ing)一个单件模式的典型结构很快就出现在我的面前: class Singleton { public: ~Singleton(){} static Singleton* Instance() {…

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. }

转载于:https://www.cnblogs.com/MaxWoods/p/4127450.html

http://www.lbrq.cn/news/1238401.html

相关文章:

  • 欧美浅蓝色新闻网站css模板/推广论坛有哪些
  • 南京网站建设王道下拉??/外贸网站推广怎么做
  • 徐州市中宇建设工程有限公司网站/万能优化大师下载
  • 建行网站/网页搜索优化
  • 北京网站制作公司招聘信息/全球搜官网
  • 如何用css做网站/工厂管理培训课程
  • wordpress 蓝色主题/百度seo发帖推广
  • 奉化建设网站/推广普通话演讲稿
  • 深圳建设网站上市/营销推广工作内容
  • 网站建设与管理的现状/百度首页排名优化平台
  • 网站开发参考文献期刊/google广告投放
  • wordpress add_action/武汉排名seo公司
  • 大型集团网站建设/企业网站设计规范
  • 许昌做网站公司报价/域名ip查询入口
  • 青岛做网站建网站/站长统计幸福宝2022年排行榜
  • 网站建设及维护业务服务合同/搜索词分析
  • 安宁网站建设 熊掌/怎么理解搜索引擎优化
  • 河北网络推广/大连seo外包平台
  • 建设淘宝网站需要多少钱/百度营销中心
  • 南京做网站多少钱/有效获客的六大渠道
  • 海口网站运营托管咨询/软文投放平台有哪些
  • 罗岗网站建设公司/长沙靠谱的关键词优化
  • 网站开发类毕业设计/seoapp推广
  • 网站制作学校找哪家/有利于seo优化的是
  • 做建材哪个网站平台好/百度大数据
  • java社交网站开发/网站收录查询爱站
  • 网站开发培训流程/网站建设费用明细表
  • wordpress导航仿制/安卓系统优化app
  • 广东省高水平建设专业网站/关键词指数查询工具
  • 企业年金的作用及意义/试分析网站推广和优化的原因
  • 关于 xrdp远程桌面报错“Error connecting to sesman on 127.0.0.1:3350“的解决方法
  • 跨语言模型中的翻译任务:XLM-RoBERTa在翻译任务中的应用
  • Day22--回溯--77. 组合,216. 组合总和 III,17. 电话号码的字母组合
  • i Battery Box V3.7 客户端电池检测仪
  • ubuntu22.04离线一键安装gpu版docker
  • PyTorch 中 Tensor 统计学函数及相关概念