欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++实现单例模式的方法

程序员文章站 2022-03-04 14:00:15
目录饿汉模式懒汉模式锁 + 智能指针局部静态变量总结饿汉模式类实例化就会占用内存,浪费资源,效率高,不存在线程安全问题。class singleton{ singleton() { } s...

饿汉模式

类实例化就会占用内存,浪费资源,效率高,不存在线程安全问题。

class singleton{
    singleton() { }
    static singleton* m_instance_ptr;
public:
    static singleton* get_instance() {
        return m_instance_ptr;
	}
};
singleton* singleton::m_instance_ptr = new singleton();
int main(){
    singleton* instance1 = singleton::get_instance();
    singleton* instance2 = singleton::get_instance();
    return 0;
}

懒汉模式

延迟加载,节省资源,效率低,存在线程安全问题。

class singleton {
    singleton() { }
    static singleton* m_instance_ptr;
public:
    static singleton* get_instance() {
        if(m_instance_ptr == nullptr)
			m_instance_ptr = new singleton();
        return m_instance_ptr;
    }
};
singleton* singleton::m_instance_ptr = nullptr;
int main(){
    singleton* instance1 = singleton::get_instance();
    singleton* instance2 = singleton::get_instance();
    return 0;
}

锁 + 智能指针

线程安全(锁)+ 内存回收(智能指针)

#include <iostream>
#include <memory>
#include <mutex>
class singleton {
public:
	typedef std::shared_ptr<singleton> ptr;
    static ptr get_instance() {
        if(m_instance_ptr == nullptr) {
            std::lock_guard<std::mutex> lk(m_mutex);
            if(m_instance_ptr == nullptr)
				m_instance_ptr = std::shared_ptr<singleton>(new singleton);
        }
        return m_instance_ptr;
    }
private:
	singleton() {}
    static ptr m_instance_ptr;
    static std::mutex m_mutex;
};
singleton::ptr singleton::m_instance_ptr = nullptr;
std::mutex singleton::m_mutex;
int main(){
    singleton::ptr instance1 = singleton::get_instance();
    singleton::ptr instance2 = singleton::get_instance();
    return 0;
}

局部静态变量

class singleton {
public:
    singleton(const singleton&)=delete;
    static singleton& get_instance() {
        static singleton instance;
        return instance;
    }
private:
    singleton() {}
};
int main() {
	singleton& instance1 = singleton::get_instance();
    singleton& instance2 = singleton::get_instance();
    return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!