前言
在单例模式中,由于没有自动调用类的析构机制,导致无法内存释放,本文将介绍两种自动释放的方法
一.使用atexit释放内存
atexit是C++标准库中的一个函数,用于在程序退出时执行一些清理工作。它的工作原理是,当程序正常退出(例如,通过调用exit函数或接收到一个信号)时,atexit会按照注册的顺序执行这些清理工作。
class SingleClass {
public:
static SingleClass& GetInstance() {
if (instance_ == nullptr) {
std::once_flag flag;
std::call_once(flag, [&]() {
instance_= new SingleClass;
atexit([]() {
delete instance_;
});
});
}
return *instance_;
}
private:
SingleClass() { cout << "create" << endl; };
~SingleClass()
{ cout << "destorted" << endl;
};
SingleClass& operator=(const SingleClass&) = delete;
SingleClass(const SingleClass&) = delete;
SingleClass(SingleClass&&) = delete;
SingleClass& operator=(SingleClass&&) = delete;
static SingleClass* instance_;
};
SingleClass* SingleClass::instance_=nullptr ;
二.使用模板
在C++11中,静态变量是线程安全的
template<typename T>
class Singleton {
public:
static T & GetInstance() {
static T instance;
return instance;
}
protected:
virtual ~Singleton() {}
Singleton() {}
private:
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) =delete;
Singleton(Singleton&&) = delete;
Singleton& operator=(Singleton&&) =delete;
};
class DesignPattern : public
Singleton<DesignPattern> {
friend class Singleton<DesignPattern>;
private:
DesignPattern() {}
~DesignPattern() {}
};