Вот код для выполнения того, что вы хотите (вероятно, не скомпилируется, так как у меня нет наддува, и я пишу его из памяти):
class YourClass; // your data type, defined somewhere else
boost::object_pool<YourClass> allocator;
void destroy(YourClass* pointer)
{
allocator.destroy(pointer);
}
boost::shared_ptr<YourClass> create()
{
// usage of object_pool<??>::construct requires that you have a
// YourClass::YourClass(void) defined. If you need to pass arguments
// to the new instance, you need to do that separately.
//
// for example using a YourClass::Initialize(your,parameters,here) method
// before returning from this function
return boost::shared_ptr<YourClass>( allocator.construct(), &destroy );
}
// usage:
boost::shared_ptr<YourClass> newObject = create();
Я реализовал это дважды, в двух разных проектах. В обоих случаях функции создания и уничтожения были синхронизированы (вы можете добавить блокировку boost::mutex
при использовании распределителя), и они были членами фабричного класса (и подпись destroy
была изменена до void (YourClass*)
через использование boost::bind
).
Вы также можете избежать написания двух дополнительных функций (destroy
и create
), напрямую связывая object_pool<YourClass>::destroy
в конструкторе boost :: shared_ptr.
Мне лень сейчас все это писать :).
Редактировать (перенес мой ответный комментарий сюда для форматирования кода):
Чтобы связать функцию уничтожения:
class ClassFactory
{
boost::object_pool<YourClass> allocator;
public:
boost::shared_ptr<YourClass> create()
{
return boost::shared_ptr<YourClass>(
allocator.construct(),
boost::bind(&ClassFactory::destroy, this, _1) );
}
void destroy(YourClass* pointer)
{
allocator.destroy(pointer);
}
};
ClassFactory
должен иметь более длительный срок службы, чем shared_ptr
(если экземпляр ClassFactory
удален, указатель this, переданный экземпляру shared_ptr
, будет недействительным - и вылетит из приложения, когда удаляется shared_ptr
YourClass
экземпляр).