巧用std::shared_ptr全局對象釋放單例內存


巧用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;
}

  輸出:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM