C++单例模式

自从阿里被虐了回来就想写一篇单例模式了,一直拖到现在,从前也查了好多,自我感觉还是一个不错的,背了下来,今天再查资料发现还是漏洞太多了,真的不的不佩服C++是多么的强大啊!~

首先拿我之前的那个来分享:

class CSingleton
{
public:
	static CSingleton * GetInstance()
	{
		if (NULL == m_pInstance)
			m_pInstance = new CSingleton();
		return m_pInstance;
	}
	static void Release()    //必须,否则会导致内存泄露
	{
		if (NULL != m_pInstance)
		{
			delete m_pInstance;
			m_pInstance = NULL;
		}
	}

protected:
	CSingleton()
	{
		cout << "CSingleton" << endl;
	};
	static CSingleton * m_pInstance;
};

CSingleton* CSingleton::m_pInstance = NULL;
这个当时我认为还可以,但是拿去阿里面试官那说这个还是有点小问题,然后就说不适合多线程。

今天回来查资料大多都不适合多线程,还有自己又发现了一些错误,可以进行深拷贝和友元可以访问。所以修改如下:

class CSingleton
{
public:
	static CSingleton * GetInstance()
	{
		if (NULL == m_pInstance)
		{
			Lock lock(cs);
			m_pInstance = new CSingleton();
		}
		return m_pInstance;
	}
	static void Release()    //必须,否则会导致内存泄露
	{
		if (NULL != m_pInstance)
		{
			Lock lock(cs);
			delete m_pInstance;
			m_pInstance = NULL;
		}
	}

protected:
	CSingleton()
	{
		cout << "CSingleton" << endl;
	};
	static CSingleton * m_pInstance;
private:
	CSingleton();
	CSingleton(const CSingleton &);
	CSingleton& operator = (const CSingleton &);
};

CSingleton* CSingleton::m_pInstance = NULL;

至于如何加锁,VC里边MFC有临界区,其他的也都有,各不相同就不写了!~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值