c++单例模式

1.实现方法


  [1]把构造函数设置为private,因此不能在外部创建实例,并且提供一个public方法访问实例。

  [2]把析构函数是private和public都可以,private时需要定义一个垃圾回收类自动销毁这个实例,public时可以手动delete。

2.单实例销毁的方法


  【1】把单例对象放在静态区初始化:

    此时在程序退出后会自动调用类的析构函数。

  【2】使用垃圾回收类:

    包含一个垃圾回收类,并且初始化一个该类的静态对象,当程序退出时,该静态对象会自动调用这个类的析构函数,这个类的析构函数里面再调用外部类的析构函数。

    那为什么不是程序退出时直接自动调用外部类的析构函数就可以了?

      因为程序退出时,在静态区的对象(非指针,而是对象的内存在静态区)会自动调用析构函数,而在堆或栈的对象不会自动调用析构函数。

      因此垃圾回收类也有一个静态对象,程序退出时会自动调用静态对象的析构函数。而单例对象只是指针在静态区,对象则在堆区,因此程序退出时不会自动调用单例对象的析构函数。

3.实现代码


  [1]饿汉式单例:实例作为类的静态成员变量,程序启动时在静态区创建实例,程序退出时自动调用析构函数,并且线程安全(此例子把析构设置为public,手动delete实例):

#include <iostream>  
#include <stdio.h>  
using namespace std;  
  
class singleton  
{  
public:  
    static singleton *get_instance(){  
        static singleton single;
        return &single;
    }  
	
	~singleton(){
        printf("~singleton() called.\n");
    }  
	
private:  
    singleton(){
        printf("singleton() called.\n");
    }
};  
  
int main(int argc, char *argv[])  
{  
    singleton *s = singleton::get_instance();  
    return 0;  
}

  [2]懒汉式单例:第一次访问的时候创建实例(此时把析构设置为private,并且添加了垃圾回收类):

#include <iostream>  
#include <stdio.h>  
using namespace std;  
  
class singleton  
{  
public:  
    static singleton *get_instance(){  
        if(m_instance == NULL){  
            m_instance = new singleton();  
            printf("get_instance() called.\n");
        }  
        
        return m_instance;  
    }  
    
    ~singleton(){
        printf("~singleton() called.\n");
    }  
  
private:  
    singleton(){
        printf("singleton() called.\n");
    }  
    
    class gc
    {  
    public:  
        gc(){  
            printf("gc() called.\n");
        }
        
        ~gc(){  
            printf("~gc() called.\n");
            if(m_instance != NULL){  
                delete m_instance;  
                m_instance = NULL;  
            }  
        }
    };  
    
    static gc m_gc;
    static singleton *m_instance;  
};  
  
singleton *singleton::m_instance = NULL;  
singleton::gc singleton::m_gc;

int main(int argc, char *argv[])  
{  
    singleton *s = singleton::get_instance();  
    return 0;  
}

 

posted on 2019-03-20 14:56  能量星星  阅读(200)  评论(0)    收藏  举报

导航