设计模式之单例模式(懒汉式和饿汉式)

设计模式第一个模式通常是单例模式,是为了防止某个类存在多个对象。
代码如下:

**singlon.h:**
#pragma once
#ifndef _SINGLON_H
#define _SINGLON_H

class singlon
{
public:
    static singlon *GetInstance();
    static singlon *FreeInstance();
    int count;
private:
    static singlon *m_psl;
    singlon(); 
};
#endif


**singlon.cpp:**(懒汉式)
#include "stdafx.h"
#include "singlon.h"

singlon *singlon::GetInstance()
{
    if (m_psl == nullptr)
    {
        m_psl = new singlon;//懒汉式
    }
    return m_psl;
}
singlon *singlon::FreeInstance()
{
    if (m_psl != nullptr)
    {
        delete m_psl;
        m_psl = nullptr;
    }
    return m_psl;
}

singlon::singlon()
{
    cout << "singlon 构造函数" << endl;
}
singlon *singlon::m_psl = nullptr;//类的静态成员变量是需要在类外初始化的,不能在.h里哦


**singlon.cpp:**(饿汉式)
singlon *singlon::GetInstance()
{
    return m_psl;
}
singlon *singlon::m_psl = new singlon; //饿汉式
//直接在.cpp方法的外面new出来singlon *对象;GetInstance()直接返回即可

//1”懒汉”模式虽然有优点,但是每次调用GetInstance()静态方法时,必须判断
// NULL == m_instance,使程序相对开销增大。
//2多线程中会导致多个实例的产生,从而导致运行代码不正确以及内存的泄露。
//3提供释放资源的函数

讨论: 这是因为C++中构造函数并不是线程安全的。
C++中的构造函数简单来说分两步:
第一步:内存分配
第二步:初始化成员变量
由于多线程的关系,可能当我们在分配内存好了以后,还没来得急初始化成员变量,就进行线程切换,另外一个线程拿到所有权后,由于内存已经分配了,但是变量初始化还没进行,因此打印成员变量的相关值会发生不一致现象。

`

猜你喜欢

转载自blog.csdn.net/qq_34866146/article/details/80825497