Poco::AutoReleasePool

Poco::AutoReleasePool を紹介します。

Poco::AutoReleasePool は、リファレンスカウント付きオブジェクトのガーベッジコレクションをやってくれます。
リファレンスカウント付きオブジェクトを多数インスタンス化し、それをオーナーとなるクラスが管理する場合などに便利です。

AutoReleasePoolTest.cpp

Poco::RefCountedObject を継承した MyObject クラスと、それを複数登録できる MyObjectOwner クラス
 を作成。
・MyObjectOwner::addObject() で、Poco::AutoReleasePool に追加。
・MyObjectOwner をデストラクトする時に、Poco::AutoReleasePool::release() を呼んでいるが、出力ログ
 の順番を調整したかっただけなので、本来は呼ばなくて良い。

#include <Poco/RefCountedObject.h>
#include <Poco/Format.h>
#include <Poco/AutoReleasePool.h>
 
#include <string>
#include <list>
 
#include "ScopedLogMessage.h"
#include "PrepareConsoleLogger.h"
 
const int kNumObjects = 3;
 
class MyObject;	// forward declaration
 
class MyObjectOwner
{
public:
	MyObjectOwner(ScopedLogMessage& msg) :
		m_Msg(msg)
	{
		m_Msg.Message(" MyObjectOwner created");
	}
 
	~MyObjectOwner()
	{
		m_AutoReleasePool.release();
		m_Msg.Message(" MyObjectOwner deleted");
	}
 
	void addObject(MyObject* pObject)
	{
		m_MyObjectList.push_back(pObject);
		m_AutoReleasePool.add(pObject);
	}
 
	std::list<MyObject*>& getObjectList()
	{
		return m_MyObjectList;
	}
 
private:
	ScopedLogMessage&				m_Msg;
	std::list<MyObject*>			m_MyObjectList;
	Poco::AutoReleasePool<MyObject>	m_AutoReleasePool;
};
 
class MyObject : public Poco::RefCountedObject
{
public:
	MyObject(ScopedLogMessage& msg, int id, MyObjectOwner* owner) :
		m_Msg(msg)
	,	m_Name("MyObject" + Poco::format("%d", id))
	,	m_pOwner(owner)
	{
		m_Msg.Message(Poco::format("  %s created", m_Name));
	}
 
	const std::string& name() const
	{
		return m_Name;
	}
 
private:
	~MyObject()
	{
		m_Msg.Message(Poco::format("  %s deleted", m_Name));
	}
 
	ScopedLogMessage&	m_Msg;
	const std::string	m_Name;
	MyObjectOwner*		m_pOwner;
};
 
int main(int /*argc*/, char** /*argv*/)
{
	PrepareConsoleLogger logger(Poco::Logger::ROOT, Poco::Message::PRIO_INFORMATION);
 
	ScopedLogMessage msg("AutoReleasePoolTest ", "start", "end");
 
	MyObjectOwner owner(msg);
 
	for(int i=0; i<kNumObjects; ++i)
	{
		owner.addObject(new MyObject(msg, i, &owner));
	}
 
	std::list<MyObject*>::iterator itr = owner.getObjectList().begin();
	std::list<MyObject*>::iterator itrEnd = owner.getObjectList().end();
	while(itr != itrEnd)
	{
		msg.Message(Poco::format("   name() = %s", (*itr)->name()));
		++itr;
	}
 
	return 0;
}

Results of execution

[0] AutoReleasePoolTest start
[0]  MyObjectOwner created
[0]   MyObject0 created
[0]   MyObject1 created
[0]   MyObject2 created
[0]    name() = MyObject0
[0]    name() = MyObject1
[0]    name() = MyObject2
[0]   MyObject0 deleted
[0]   MyObject1 deleted
[0]   MyObject2 deleted
[0]  MyObjectOwner deleted
[0] AutoReleasePoolTest end

Downloads

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

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=""> <s> <strike> <strong>