饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断了,节省了运行时间,调用效率高,不能延时加载。
饿汉:不管用户用不用得到,它都会提前实例化对象等待用户调用——在单例类定义的时候就进行实例化。(本身就是线程安全的,如下例子)
#include "../common.h"
//final表示该类不可被继承
//饿汉式
class CMySingleton final
{
public:
~CMySingleton();
static CMySingleton *getInstance(char *pData);
CMySingleton(CMySingleton &) = delete;
CMySingleton &operator=(const CMySingleton &) = delete;
private:
static CMySingleton *pCMySingleton;
CMySingleton(char *pData);
char *m_data;
};
CMySingleton::CMySingleton(char *pData)
{
printf("This is Constructors (data:%s) ...\n", pData);
}
CMySingleton::~CMySingleton()
{
printf("This is Destructor ...\n");
if (m_data != nullptr)
{
delete[] m_data;
m_data = nullptr;
}
}
CMySingleton *CMySingleton::getInstance(char *pData)
{
return pCMySingleton;
}
void *pthCreate(void *)
{
printf("into pthCreate() ... \n");
CMySingleton *singleton_1 = CMySingleton ::getInstance(nullptr);
}
//直接实例化
CMySingleton* CMySingleton::pCMySingleton = new CMySingleton(nullptr);
int main()
{
char data[] = "abcdefg";
CMySingleton *singleton_1 = CMySingleton :: getInstance(data);
CMySingleton *singleton_2 = CMySingleton :: getInstance(data);
}
结果:
This is Constructors (data:(null)) ...
本身是线程安全,就不需要再测。程序退出前不调用delete,就不会执行析构函数,只能由系统回收(和懒汉模式有缺陷版一样)。