C++ 单例模式

单例模式写法:
注意:静态成员使用指针的话,程序退出时无法指针类的析构函数, 在类内添加回收单例的类,析构的时候将该单例对象析构, 就可以了
例如:
class Singleton
{
public:
static Singleton *getInstance()
{
if ( m_pInstance == nullptr ) // 静态成员使用指针的话,程序退出时无法指针类的析构函数, 会造成内存泄漏
{
m_pInstance = new LoggerMng();
}
return m_pInstance;
}

Singleton::~LoggerMng()
{
// 执行不到
std::cout << __PRETTY_FUNCTION__ << std::endl;
}

private:
static Singleton *m_pInstance;
};

Singleton *Singleton::m_pInstance = nullptr;

改进1:
在单例类种创建回收对象, 该成员在析构时自动删除单例对象
class Singleton
{
public:
...
// 单例回收对象, 该成员在析构时自动删除单例对象
class GarbageCollector
{
public:
~GarbageCollector()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
if ( m_pInstance )
{
delete m_pInstance;
m_pInstance = nullptr;
}
}
};

static GarbageCollector gc;

private:
static Singleton *m_pInstance;
};

Singleton::GarbageCollector gc;

改进2:
单例中构造静态局部成员变量, 但是要返回引用, 不然每次调用都会构造一个新的类
class Singleton
{
public:
Singleton &getInstance()
{
static Singleton instance;
return instance;
}
}

改进3:
使用智能指针, 让智能指针自动释放对象指针; 调用时,要使用智能指针对象中的裸指针
class Singleton
{
public:
static unique_ptr<Singleton> &getInstance()
{
if ( m_ptrInstance == nullptr )
{
m_ptrInstance.reset(new Singleton());
}
return m_ptrInstance;
}

private:
static unique_ptr<Singleton> m_pInstance;
};

unique_ptr<Singleton> Singleton::m_ptrInstance(nullptr);

posted @   蔡头一枚  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示