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之后,没有代码再调用析构函数。
// 最好的方法就是让这个类自己知道在合适的时候把自己删除,程序结束系统会自动释放所有的全局变量,这也包括静态成员变量。可以利用这个特性就可以实现在单例类中定义一个今天成员变量,它的唯一工作就是在析构函数中释放单例类对象。
【pthread_once + atexit】释放  (和平台相关,用到线程)
#include <stdlib.h>
int atexit(void (*function)(void));       //当 main 函数退出时,被注册的函数会自动调用
#include <iostream>
#include<stdlib.h>
using namespace std;
void func()
{
        cout<<"func()"<<endl;
}
int main()
{
        cout<<"main()"<<endl;      
        atexit(func);
 //当main退出时,被注册的函数会自动调用
        return 0;
}

#include <pthread.h>
pthread_once_t once_control = PTHREAD_ONCE_INIT;
int pthread_once ( pthread_once_t  *once_control, void  (*init_routine) (void));       //多次调用,只有第一次调用会执行参数函数

#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自动释放的更多相关文章

  1. [转]单例模式——C++实现自动释放单例类的实例

    [转]单例模式——C++实现自动释放单例类的实例 http://www.cnblogs.com/wxxweb/archive/2011/04/15/2017088.html http://blog.s ...

  2. Singleton单例类模式

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  3. [Android面试题-7] 写出一个Java的Singleton类(即单例类)

    1.首先明确单例的概念和特点: a>单例类只能有一个实例 b>单例类必须自己创建一个自己的唯一实例 c>单例类必须为其他所有对象提供这个实例 2.单例具有几种模式,最简单的两种分别是 ...

  4. Unity Singleton 单例类(Unity3D开发之二十)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/47335197 ...

  5. Unity Singleton 单例类(Unity3D开发)

    一.添加单例模板类 using UnityEngine; public class Singleton<T> : MonoBehaviour where T : MonoBehaviour ...

  6. 创建类模式(五):单例(Singleton)

    定义 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式一般情况下通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化. 和静态变量的区别 虽然 ...

  7. 设计模式(java) 单例模式 单例类

    ·单例类 单实例类,就是这个类只能创建一个对象,保证了对象实例的唯一性. 1.单例模式( Singleton Pattern) 是一个比较简单的模式, 其定义如下:Ensure a class has ...

  8. (七)boost库之单例类

    (七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...

  9. 设计模式的征途—1.单例(Singleton)模式

    单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛.创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修 ...

随机推荐

  1. NodeJS NPM HTTPS

    npm config set registry http://registry.npmjs.org/

  2. RPC细节

    服务化有什么好处? 服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦,如下图所示: 服务A:欧洲团队维护,技术背景是Java 服务B:美洲团队维护,用C++实现 ...

  3. Druid学习之路 (三)Druid的数据源和段

    作者:Syn良子 出处:https://www.cnblogs.com/cssdongl/p/9703204.html 转载请注明出处 Druid的数据源和分段 Druid的数据存储在"Da ...

  4. MVC的局部视图传参的小技巧--见人才网头部导航

    当我们设计一个局部视图时,当出现有类似导航的功能(如:选择左边的某个按钮跳到某个页,且顶部导航也作相印改变),如果我们选择把导航作为局部视图来处理,调用就可以做如下处理: @Html.RenderAc ...

  5. 如何在Kubernetes集群动态使用 NAS 持久卷

    1. 介绍: 本文介绍的动态生成NAS存储卷的方案:在一个已有文件系统上,自动生成一个目录,这个目录定义为目标存储卷: 镜像地址:registry.cn-hangzhou.aliyuncs.com/a ...

  6. 20145312 实验二《 Java面向对象程序设计》

    20145312 实验二< Java面向对象程序设计> 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解 ...

  7. Visual Studio 2010生成解决方案时,导致C盘空间越来越小

    为了从根本上解决问题,还是去掉智能跟踪选项吧,方案: VS2010-->工具-->选项-->IntelliTrance-->将“启用IntelliTrace”勾选去掉--> ...

  8. ArchLinux基本系统到XFCE4桌面搭建

      Keep It Simple, Stupid 这是ArchLinux的哲学,更是一种人生哲学 好久没用linux了,这段时间因为一点点"破坏性"需求重新拾起linux用了一把 ...

  9. webservice的测试案例

    1.服务器端 服务器接口Test_service.java package com.xiaostudy; /** * @desc 服务器接口 * @author xiaostudy * */ publ ...

  10. 秒懂算法3——插入排序(C#实现)

    算法思路: 将n个元素分成[已排序]和[未排序]两部分.每次将[未排序]中的一个元素取出,插入到已排序中的相应位置.直至所有元素排序完毕. [已排序] [未排序] { { a[0] }         ...