设计模式第一个模式通常是单例模式,是为了防止某个类存在多个对象。
代码如下:
**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++中的构造函数简单来说分两步:
第一步:内存分配
第二步:初始化成员变量
由于多线程的关系,可能当我们在分配内存好了以后,还没来得急初始化成员变量,就进行线程切换,另外一个线程拿到所有权后,由于内存已经分配了,但是变量初始化还没进行,因此打印成员变量的相关值会发生不一致现象。
`