关于C++单件模式释放对象
http://blog.csdn.net/windboyzsj/article/details/2790485
最近接触的一个项目要用到单件模式,我像往常一样哒哒(敲击键盘ing)一个单件模式的典型结构很快就出现在我的面前:
- class Singleton
- {
- public:
- ~Singleton(){}
- static Singleton* Instance()
- {
- if (_instance == NULL)
- {
- _instance = new Singleton();
- }
- return _instance;
- }
- private:
- Singleton(){}
- static Singleton* _instance;
- };
- Singleton* Singleton::_instance = NULL;
不知道为什么,这次突然觉得new这个单词太耀眼了,熟悉c++的程序员都知道,有new就离不开delete,既然单件模式共用一个实例,那么这个实例什么时候释放呢。带着好奇我在它的析构函数加了个打印语句,但由于new操作是在堆里分配内存,估计它的析构函数不会被调用,而试验结果确实如此。这样一来那单件模式的析构函数不是完全废了吗,如果这个单件类还有指针成员用new分配了空间那又应该在哪里释放?单件的实例又应该如何释放。当然,我们可以在程序退出时通过 delete Singleton::Instance(); 来释放内存并触发析构函数。但这样一来,写好的类给别人用时就要叮嘱别人,用完后一定要释放- - !,再说别人不一定记得...有没有一种机制让单件模式自动释放?百度,google很久,发现关注这个问题的寥寥无几,但还是给我找到了一篇文章让我再次领略C++的灵活。按此文章大概把代码修改如下;
- class Singleton
- {
- public:
- ~Singleton(){}
- static Singleton* Instance()
- {
- if (_instance == NULL)
- {
- _instance = new Singleton();
- }
- return _instance;
- }
- private:
- Singleton(){}
- static Singleton* _instance;
- class Cleaner
- {
- public:
- Cleaner(){}
- ~Cleaner()
- {
- if(Singleton::Instance())
- delete Singleton::Instance();
- }
- };
- static Cleaner clr;
- };
- Singleton* Singleton::_instance = NULL;
事先声明我用VC6.0编译上面的代码(当然我有加一些测试代码)发现,clr并没有实例化,当然也就是没有析构了,暂时不清楚为什么,但这里的设计却是很值得品味。它通过一个内嵌类和一个静态成员来实现了自动释放的机制,相当于为单件加了个垃圾回收器。整个设计最巧妙的地方在于static Cleaner clr;这个声明,由于是静态成员,系统会在栈里分配内存,回收工作也就由系统自动完成了。这个思路另我想起了通过静态变量来实现类的静态构造函数,他们都有异曲同工之处。至于私有的内嵌类主要是防止单件类的专用垃圾筒被打扰...
虽然上面代码没有达到目的,但根据他的思路,可以做一下调整,把Cleaner的实例化延迟,下面贴出整个测试代码,一下代码在VC6编译通过。
- #include <iostream.h>
- class Singleton
- {
- public:
- ~Singleton(){cout<<"singleton deconstruct"<<endl;}
- static Singleton* Instance()
- {
- if (_instance == NULL)
- {
- _instance = new Singleton();
- static Cleaner cl; //延迟到这里
- }
- return _instance;
- }
- void Print(char* str)
- {
- cout<<"singleton print:"<<str<<endl;
- }
- private:
- Singleton(){cout<<"singleton construct"<<endl;}
- static Singleton* _instance;
- class Cleaner
- {
- public:
- Cleaner(){cout<<"cleaner construct"<<endl;}
- ~Cleaner()
- {
- cout<<"cleaner deconstruct"<<endl;
- if(Singleton::Instance())
- delete Singleton::Instance();
- }
- };
- };
- Singleton* Singleton::_instance = NULL;
- int main(int argc, char* argv[])
- {
- Singleton::Instance()->Print("print 1");
- Singleton::Instance()->Print("print 2");
- return 0;
- }
关于C++单件模式释放对象的更多相关文章
- 设计模式之单件模式(Singleton Pattern)
一.单件模式是什么? 单件模式也被称为单例模式,它的作用说白了就是为了确保“该类的实例只有一个” 单件模式经常被用来管理资源敏感的对象,比如:数据库连接对象.注册表对象.线程池对象等等,这种对象如果同 ...
- 单件模式Singleton来控制窗体被重复或多次打开
本文转载:http://blog.csdn.net/a0700746/article/details/4473796 一般在百度搜一下,会出来一下内容,看来很好用.Singleton很方便的一个用处就 ...
- Java设计模式——线程安全的单件模式
单件模式,也称单例模式,用以创建独一无二的.只能有一个实例的对象. 单件模式的类图是所有模式的类图中最简单的--只有一个类.尽管从类设计的视角来看单件模式很简单,但是实现上还是会遇到一些问题,本文着重 ...
- C#设计模式——单件模式
一.为何需要单件模式 需求 我们开发了一个大型的项目,其中存在许多的工具类.但是其中很多的工具类我们并不是经常使用得到,甚至 一次都不会使用.但是这些工具类都是静态的类,会消耗很多的内存,即使一次都不 ...
- [设计模式] javascript 之 单件模式
单件模式说明 1. 说明:单件模式,就是静态化的访问中已经实例化的对象,这个对象只能通过一个唯一的入口访问,已经实例或待实例化的对象:面向对象语言如Java, .Net C#这样的服务端动态语言里,能 ...
- .NET设计模式(2):单件模式(Singleton Pattern)
转载:http://terrylee.cnblogs.com/archive/2005/12/09/293509.html 单件模式(Singleton Pattern) --.NET设计模式系列之二 ...
- NET设计模式(2):单件模式(Singleton Pattern)[转载]
单件模式(Singleton Pattern) ——.NET设计模式系列之二 Terrylee,2005年12月07日 概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问 ...
- 设计模式(二)单件模式Singleton(创建型)
SINGLETON(单件)—对象创建型模式 几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的.您希望在应用程序中共享数据库句柄,因为在保持连接打开或关 ...
- 9、Cocos2dx 3.0游戏开发三查找值小工厂方法模式和对象
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...
随机推荐
- DNS劫持和DNS污染的区别
我们知道,某些网络运营商为了某些目的,对DNS进行了某些操作,导致使用ISP的正常上网设置无法通过域名取得正确的IP地址.常用的手段有:DNS劫持和DNS污染. 什么是DNS劫持 DNS劫持就是通过劫 ...
- About-JavaOOAD
软件工程三要素 方法:完成软件开发的各项任务的技术方法,为软件开发提供 “如何做” 的技术 工具:为运用方法而提供的自动的或半自动的软件工程的支撑环境 过程:为了获得高质量的软件所需要完成的一 ...
- 常用Sql语句书写
一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [into] <表名> [列名] values <列值> 例:insert into Strdent ...
- 1531: [POI2005]Bank notes二进制优化(c++)
Description Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我 ...
- Splunk及splunkforward简单部署配置
部署环境 操作系统 服务器操作系统版本:CentOS release 6.5 (Final) 2.6.32-431.el6.x86_64 软件 软件版本:splunk-6.4.0 tar: splun ...
- "2016-10-06T12:09:18.303+0800"
Java public static void main(String[] args) throws ParseException { SimpleDateFormat sdf = new Simpl ...
- 【07_226】Invert Binary Tree
Invert Binary Tree Total Accepted: 54994 Total Submissions: 130742 Difficulty: Easy Invert a binary ...
- Django学习(二)
一 高亮显示 <script type="text/javascript"> $(document).ready(function () { $("#nav ...
- 【Leetcode】【Medium】Group Anagrams
Given an array of strings, group anagrams together. For example, given: ["eat", "tea& ...
- 使用VS2013在WIN8.1上运行gaclib的hello world
首先:gaclib的官网是http://www.gaclib.net/ 需要了解更多信息的请自己去官网,我也是刚刚研究 第一步 下载gaclib的源码 这些文件是运行程序所必须的 第二步 ...