单例模式写法:
注意:静态成员使用指针的话,程序退出时无法指针类的析构函数, 在类内添加回收单例的类,析构的时候将该单例对象析构, 就可以了
例如:
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);
标签:pInstance,Singleton,nullptr,模式,static,C++,单例,指针 From: https://www.cnblogs.com/weijian168/p/17989738