巧用std::shared_ptr
單例的使用相對比較廣泛,但是需要在程序退出前調用它的析構函數對數據進行釋放,常規做法是在main函數末尾進行釋放工作,
但是這樣相對比較繁瑣,因此便有了利用全局變量由系統負載析構的特點,定義一個全局str::shared_ptr對象,對象指定對單例進行析構。
因此不需要我們關心何時析構單例,堪稱方便。
SingleObject.hpp
#ifndef SINGLEOBJECT_H
#define SINGLEOBJECT_H
class SingleObject
{
public:
static SingleObject& GetInstance();
static SingleObject* GetInstancePtr();
static void DoSomeThing();
static void DelObj();
private:
static void NewObj();
SingleObject();
~SingleObject();
static SingleObject* msObj;
};
#endif // SINGLEOBJECT_H
SingleObject.cpp
#include "SingleObject.hpp"
#include <iostream>
#include <memory>
std::shared_ptr<SingleObject> SingleObjectDeletor( SingleObject::GetInstancePtr(), [](SingleObject *){ SingleObject::GetInstance().DelObj(); });
SingleObject* SingleObject::msObj = NULL;
SingleObject::SingleObject()
{
std::cout << "This is the constructor of SignleObject class!\n";
}
SingleObject::~SingleObject()
{
std::cout << "This is the destructor of SingleObject class!\n";
}
void SingleObject::NewObj()
{
if( NULL == msObj )
{
// lock
msObj = new SingleObject();
// unlock
}
std::cout << "New an object, address: " << +msObj << std::endl;
}
void SingleObject::DelObj()
{
if( NULL != msObj )
{
delete msObj;
std::cout << "Delete an object!\n";
}
}
SingleObject* SingleObject::GetInstancePtr()
{
if( NULL == msObj )
{
NewObj();
}
return msObj;
}
SingleObject& SingleObject::GetInstance()
{
if( NULL == msObj )
{
NewObj();
}
return *msObj;
}
void SingleObject::DoSomeThing()
{
std::cout << "SingleObject do some thing!\n";
}
main.cpp
#include <iostream>
#include "SingleObject.hpp"
int main(int argc, char **argv)
{
SingleObject::GetInstance().DoSomeThing();
return 0;
}
輸出:

