码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2016-01-21 23:14:30      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

适用于单线程!需要线程安全的例子(互斥)可看这里,写的很好。。。我网上看到new/delete/malloc是线程安全的,只要调用了多线程函数,链接的库就是支持线程安全的,看这里

#include <iostream>
using namespace std;

//xxx.h
class CLogger { public: friend CLogger* GetLogger(); void info(const char* s) const { cout << s << endl; } private: CLogger() { //初始化工作 } ~CLogger() { cout << "~CLogger()" << endl; } CLogger(const CLogger&); CLogger& operator =(const CLogger&); static CLogger* GetInstance() { if(m_pLogger == NULL) { if (m_pLogger == NULL) m_pLogger = new CLogger; } return m_pLogger; } static CLogger *m_pLogger; class CGarBo { public: ~CGarBo() { cout << "~GarBo()" << endl; if(m_pLogger) { delete ::m_pLogger; m_pLogger = NULL; } } }; static CGarBo m_garbo; };
//xxx.cpp CLogger
* CLogger::m_pLogger = NULL; CLogger::CGarBo CLogger::m_garbo;//不含这句,编译虽不会出错,但不会生成m_garbo实例! CLogger* GetLogger() { return CLogger::GetInstance(); }
//test.cpp
int main() { GetLogger()->info("hello world"); return 0; }

技术分享

 

也可以这样:

CLogger* GetLogger()
{
    static CLogger s_logger;
    return &s_logger;
}
/*
    初次调用该函数时,局部静态变量才初始化。而非是程序运行时(main前)就初始化。这和全局与class static变量不同~
    析构是在程序结束(main后)时,而不是该函数结束时。可通过以下测试:
    Sleep(4000);
    GetLogger();
    Sleep(4000) 
*/

如此,不在需要new/delete,也不需要嵌套类了,两个static成员变量也不需要了。

单例模式

标签:

原文地址:http://www.cnblogs.com/sfqh/p/5149346.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!