Poco::RefCountedObject

Poco::RefCountedObject を紹介します。

Poco::RefCountedObject を継承したクラスを作ることによって、Poco::AutoPtr で扱うことが可能な、リファレンスカウント付きのオブジェクトを作ることができます。

逆に、クラス側にリファレンスカウント機能を持たない場合でも、前回紹介した Poco::SharedPtr を使えば、Poco::SharedPtr 側でリファレンスカウント機能を実現してくれます。

RefCountedObjectTest.cpp

Poco::RefCountedObject を継承した MyObject クラスを定義。
Poco::AutoPtr に MyObject のインスタンスポインタをアサインし、他の Poco::AutoPtr に代入しては
 referenceCount() の値を表示。

#include <Poco/RefCountedObject.h>
#include <Poco/AutoPtr.h>
#include <Poco/Format.h>
 
#include <string>
 
#include "ScopedLogMessage.h"
#include "PrepareConsoleLogger.h"
 
class MyObject : public Poco::RefCountedObject
{
public:
	MyObject(ScopedLogMessage& msg, const std::string& name) :
		m_Msg(msg)
	,	m_Name(name)
	{
		m_Msg.Message(Poco::format(" MyObject%s created", m_Name));
	}
 
private:
	~MyObject()
	{
		m_Msg.Message(Poco::format(" MyObject%s deleted", m_Name));
	}
 
	ScopedLogMessage&	m_Msg;
	const std::string	m_Name;
};
 
int main(int /*argc*/, char** /*argv*/)
{
	PrepareConsoleLogger logger(Poco::Logger::ROOT, Poco::Message::PRIO_INFORMATION);
 
	ScopedLogMessage msg("RefCountedObjectTest ", "start", "end");
 
	Poco::AutoPtr<MyObject> ptr1 = new MyObject(msg, "1");
	msg.Message(Poco::format("   ptr1->referenceCount() = %d", ptr1->referenceCount()));
 
	msg.Message("  ptr2 = ptr1");
	Poco::AutoPtr<MyObject> ptr2 = ptr1;
	msg.Message(Poco::format("   ptr1->referenceCount() = %d", ptr1->referenceCount()));
 
	ptr2 = new MyObject(msg, "2");
	msg.Message("  ptr2 = new MyObject(msg, \"2\")");
	msg.Message(Poco::format("   ptr1->referenceCount() = %d", ptr1->referenceCount()));
	msg.Message(Poco::format("   ptr2->referenceCount() = %d", ptr2->referenceCount()));
 
	msg.Message("  ptr3 = ptr2");
	Poco::AutoPtr<MyObject> ptr3;
	ptr3 = ptr2;
	msg.Message(Poco::format("   ptr1->referenceCount() = %d", ptr1->referenceCount()));
	msg.Message(Poco::format("   ptr2->referenceCount() = %d", ptr2->referenceCount()));
	msg.Message(Poco::format("   ptr3->referenceCount() = %d", ptr3->referenceCount()));
 
	ptr3 = new MyObject(msg, "3");
	msg.Message("  ptr3 = new MyObject(msg, \"3\")");
	msg.Message(Poco::format("   ptr1->referenceCount() = %d", ptr1->referenceCount()));
	msg.Message(Poco::format("   ptr2->referenceCount() = %d", ptr2->referenceCount()));
	msg.Message(Poco::format("   ptr3->referenceCount() = %d", ptr3->referenceCount()));
 
	return 0;
}

Results of execution

[0] RefCountedObjectTest start
[0]  MyObject1 created
[0]    ptr1->referenceCount() = 1
[0]   ptr2 = ptr1
[0]    ptr1->referenceCount() = 2
[0]  MyObject2 created
[0]   ptr2 = new MyObject(msg, "2")
[0]    ptr1->referenceCount() = 1
[0]    ptr2->referenceCount() = 1
[0]   ptr3 = ptr2
[0]    ptr1->referenceCount() = 1
[0]    ptr2->referenceCount() = 2
[0]    ptr3->referenceCount() = 2
[0]  MyObject3 created
[0]   ptr3 = new MyObject(msg, "3")
[0]    ptr1->referenceCount() = 1
[0]    ptr2->referenceCount() = 1
[0]    ptr3->referenceCount() = 1
[0]  MyObject3 deleted
[0]  MyObject2 deleted
[0]  MyObject1 deleted
[0] RefCountedObjectTest end

Downloads

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

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="">