单例类singleton自动释放
body, table{font-family: 微软雅黑; font-size: 10pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}
#include <iostream>
#include<stdio.h>
using namespace std;
class Singleton
{
class AutoRelease; //前向声明
private:
static Singleton * _pInstance;
static AutoRelease _autoRelease; // 这里只是声明一个变量
Singleton();
~Singleton();
class AutoRelease
{
public:
AutoRelease()
{
cout<<"AutoRelease()"<<endl;
}
~AutoRelease()
{
cout<<"~AutoRelease()"<<endl;
if(_pInstance!=NULL)
delete _pInstance;
}
};
public:
static Singleton * getInstance();
};
Singleton * Singleton:: _pInstance = getInstance();
//Singleton * Singleton:: _pInstance = Singleton::getInstance();
Singleton::AutoRelease Singleton:: _autoRelease; //必须要初始化
//这里才是真正的定义一个变量,类似 int a。
//非线程安全
Singleton * Singleton::getInstance()
{
cout<<"getInstance()"<<endl;
if(_pInstance == NULL)
{
_pInstance = new Singleton;
}
return _pInstance;
}
Singleton::Singleton()
{
cout<<"Singleton()"<<endl;
}
Singleton::~Singleton()
{
cout<<"~Singleton"<<endl;
}
|
【嵌套类+静态对象】释放
//静态对象函数结束自动调用析构函数释放
int main()
{
cout<<endl;
cout<<"main()"<<endl;
printf(" pInstance = %p\n",Singleton::getInstance());
cout<<endl;
Singleton * p1 = Singleton::getInstance();
Singleton * p2 = Singleton::getInstance();
printf("p1 = %p\n",p1);
printf("p2 = %p\n",p2);
cout<<endl;
return 0;
}
// 单例类在程序结束时可以显示调用析构函数来释放静态成员变量。但是这样做容易出错,容易忘记。而却也很难保证在delete之后,没有代码再调用析构函数。
// 最好的方法就是让这个类自己知道在合适的时候把自己删除,程序结束系统会自动释放所有的全局变量,这也包括静态成员变量。可以利用这个特性就可以实现在单例类中定义一个今天成员变量,它的唯一工作就是在析构函数中释放单例类对象。
|
#include <iostream>
#include<stdlib.h>
using namespace std;
void func()
{
cout<<"func()"<<endl;
}
int main()
{
cout<<"main()"<<endl;
atexit(func);
//当main退出时,被注册的函数会自动调用
return 0;
}
|
#include <iostream>
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
class Singleton
{
private:
Singleton();
~Singleton();
static Singleton * _pInstance;
static pthread_once_t _once;
public:
static Singleton * getInstance();
static void init();
static void destroy();
};
Singleton * Singleton :: _pInstance = NULL;
pthread_once_t Singleton :: _once = PTHREAD_ONCE_INIT;
Singleton::Singleton()
{
cout<<"Singleton()"<<endl;
}
Singleton::~Singleton()
{
cout<<"~Singleton()"<<endl;
}
void Singleton :: destroy()
{
cout<<"destroy()"<<endl;
if(_pInstance != NULL)
delete _pInstance;
}
|
//线程安全
Singleton * Singleton :: getInstance()
{
cout<<"getInstance()"<<endl;
pthread_once(&_once,Singleton::init);
return _pInstance;;
}
void Singleton::init()
{
cout<<"init()"<<endl;
atexit(Singleton::destroy);
if(_pInstance == NULL)
{
_pInstance = new Singleton; //在类里面进行调用
}
}
int main()
{
Singleton * p1 = Singleton::getInstance();
Singleton * p2 = Singleton::getInstance();
Singleton * p3 = Singleton::getInstance();
printf("p1 = %p\n",p1);
printf("p2 = %p\n",p2);
printf("p3 = %p\n",p3);
return 0;
}
|
单例类singleton自动释放的更多相关文章
- [转]单例模式——C++实现自动释放单例类的实例
[转]单例模式——C++实现自动释放单例类的实例 http://www.cnblogs.com/wxxweb/archive/2011/04/15/2017088.html http://blog.s ...
- Singleton单例类模式
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- [Android面试题-7] 写出一个Java的Singleton类(即单例类)
1.首先明确单例的概念和特点: a>单例类只能有一个实例 b>单例类必须自己创建一个自己的唯一实例 c>单例类必须为其他所有对象提供这个实例 2.单例具有几种模式,最简单的两种分别是 ...
- Unity Singleton 单例类(Unity3D开发之二十)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/47335197 ...
- Unity Singleton 单例类(Unity3D开发)
一.添加单例模板类 using UnityEngine; public class Singleton<T> : MonoBehaviour where T : MonoBehaviour ...
- 创建类模式(五):单例(Singleton)
定义 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式一般情况下通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化. 和静态变量的区别 虽然 ...
- 设计模式(java) 单例模式 单例类
·单例类 单实例类,就是这个类只能创建一个对象,保证了对象实例的唯一性. 1.单例模式( Singleton Pattern) 是一个比较简单的模式, 其定义如下:Ensure a class has ...
- (七)boost库之单例类
(七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...
- 设计模式的征途—1.单例(Singleton)模式
单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛.创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修 ...
随机推荐
- googleMapReduce
摘要 MapReduce是一个编程模型,也是一个处理和生成超大数据集的算法模型的相关实现.用户首先创建一个Map函数处理一个基于key/value pair的数据集合,输出中间的基于key/value ...
- Lua 基础总结
lua 数组下标从 1 开始, 不是 0 lua 逻辑运算符 与 或 非 就是英文 and or not local 局部变量 数据类型:lua是一门动态类型语言,变量没有类型,只有值才有 ...
- 【Error】安装程序无法打开注册表项 UNKNOWN\Components\...
在安装程序的时候出现错误信息: 解决方法: 依次点击开始,所有程序,附件,右键单击命令提示符,选择以管理员身份运行.运行secedit /configure /cfg %windir%\inf\def ...
- httpd结合php的fpm模式
httpd2.4版本的编译安装,不再赘述,查看上一篇:http://www.cnblogs.com/jsonhc/p/7134053.html 从官网下载php源码包:php-5.6.30.tar.b ...
- Fiddler4调试工具配置使用笔记
Fiddler最大的用处: 模拟请求.修改请求.手机应用调试 Fiddler最新版本 下载地址: http://www.telerik.com/download/fiddler Fiddler 想要监 ...
- SpringMVC HttpMessageConverter 匹配规则
以下内容,如有问题,烦请指出,谢谢! SpringMVC启动时会自动配置一些HttpMessageConverter,接收到http请求时,从这些Converters中选择一个符合条件的来进行Http ...
- Permission denied: mod_fcgid
[Tue Jun 16 13:29:08 2015] [warn] (13)Permission denied: mod_fcgid: spawn process /var/www/cgi-bin/g ...
- 【cs231n】神经网络笔记笔记2
) # 对数据进行零中心化(重要) cov = np.dot(X.T, X) / X.shape[0] # 得到数据的协方差矩阵 数据协方差矩阵的第(i, j)个元素是数据第i个和第j个维度的协方差. ...
- 从0开始 Java学习 packet用法
packet 包的用法 参考博客:https://www.cnblogs.com/Ring1981/p/6240412.html 用法 java 源文件带有包名,往往容易出错 如:H:\code\He ...
- 素数分布 - nefu 117
素数个数的位数 - nefu 117 普及一个公式: 位数公式:要求一个数x的位数,用公式:lg(x)+1 素数分布:n/ln(n) 所以直接求解n/ln(n)的位数就可以了 代码如下: #inclu ...