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) : m_Msg(msg) , m_Name("MyObject" + Poco::format("%d", id)) { 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; }; 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)); } 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日からのダウンロード数:1056
Subversion
・フリーの Subversion ホスティングサービス Assemblaで、ソースコードを管理しています。
Reference
・http://pocoproject.org にある MemoryManagement のプレセンテーション。(PDF)
![]() |
Copyright © 2010 Round Square Inc. All rights reserved. |
---|
0 Comments.