Poco::SingletonHolder

Poco::SingletonHolder を紹介します。

Poco::SingletonHolder は、ヒープ上にアロケートされる Singleton オブジェクトを管理するヘルパーテンプレートクラスです。このクラスは、Singleton オブジェクトを作成したアプリケーションが終了する時、適切にそれらを破棄します。

SingletonHolderTest.cpp

・何の変哲も無い普通のクラス SingletonTarget を Poco::SingletonHolder でインスタンス化した場合と、
 static な defaultInstance() というメンバメソッド内で、自分自身を Poco::SingletonHolder で static に
 確保する場合の2通りを例示。

#include <Poco/SingletonHolder.h>
 
#include <string>
 
#include "ScopedLogMessage.h"
#include "PrepareConsoleLogger.h"
 
ScopedLogMessage* g_pMsg = NULL;
 
class SingletonTarget
{
public:
	SingletonTarget()
	{
		if(NULL != g_pMsg)
		{
			g_pMsg->Message("  SingletonTarget created.");
		}
	}
 
	~SingletonTarget()
	{
		if(NULL != g_pMsg)
		{
			g_pMsg->Message("  SingletonTarget deleted.");
		}
	}
 
	void doSomething(void)
	{
		if(NULL != g_pMsg)
		{
			g_pMsg->Message("  SingletonTarget::doSomething called.");
		}
	}
 
private:
	SingletonTarget(const SingletonTarget&);
	SingletonTarget& operator = (const SingletonTarget&);
};
 
class ClassWithDefaultInstance
{
public:
	ClassWithDefaultInstance()
	{
		if(NULL != g_pMsg)
		{
			g_pMsg->Message("  ClassWithDefaultInstance created.");
		}
	}
 
	~ClassWithDefaultInstance()
	{
		if(NULL != g_pMsg)
		{
			g_pMsg->Message("  ClassWithDefaultInstance deleted.");
		}
	}
 
	void doSomething(void)
	{
		if(NULL != g_pMsg)
		{
			g_pMsg->Message("  ClassWithDefaultInstance::doSomething called.");
		}
	}
 
	static ClassWithDefaultInstance& defaultInstance()
	{
		static Poco::SingletonHolder<ClassWithDefaultInstance> sh;
		return *sh.get();
	}
 
private:
	ClassWithDefaultInstance(const ClassWithDefaultInstance&);
	ClassWithDefaultInstance& operator = (const ClassWithDefaultInstance&);
};
 
int main(int /*argc*/, char** /*argv*/)
{
	PrepareConsoleLogger logger(Poco::Logger::ROOT, Poco::Message::PRIO_INFORMATION);
 
	ScopedLogMessage msg("SingletonHolderTest ", "start", "end");
	g_pMsg = &msg;
 
	{
		msg.Message(" --- SingletonTarget ---");
		Poco::SingletonHolder<SingletonTarget> singleton;
		singleton.get()->doSomething();
		singleton.get()->doSomething();
	}
	{
		msg.Message(" --- ClassWithDefaultInstance ---");
		ClassWithDefaultInstance::defaultInstance().doSomething();
		ClassWithDefaultInstance::defaultInstance().doSomething();
	}
	return 0;
}

Results of execution

[0] SingletonHolderTest start
[0]  --- SingletonTarget ---
[0]   SingletonTarget created.
[0]   SingletonTarget::doSomething called.
[0]   SingletonTarget::doSomething called.
[0]   SingletonTarget deleted.
[0]  --- ClassWithDefaultInstance ---
[0]   ClassWithDefaultInstance created.
[0]   ClassWithDefaultInstance::doSomething called.
[0]   ClassWithDefaultInstance::doSomething called.
[0] SingletonHolderTest end
[0]   ClassWithDefaultInstance deleted.

Downloads

ここをクリックすると、makefile や VC++ プロジェクトなど一式がダウンロードできます。
(2013.05.31 updated)
・2010年7月21日からのダウンロード数:779

Subversion

・フリーの Subversion ホスティングサービス Assemblaで、ソースコードを管理しています。

Reference

http://pocoproject.org にある MemoryManagement のプレセンテーション。(PDF)

Powered by POCO Copyright © 2010 Round Square Inc. All rights reserved.


Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">