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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端