我希望从池中分配由 shared_ptr 管理的对象,比如 Boost 的 Pool 接口,如何实现?
3 回答
这是执行您想要的代码(可能无法编译,因为我手头没有 boost 并且我正在从内存中编写它):
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();
我在两个不同的项目中实施了两次。在两者中,create 和 destroy 函数是同步的(您可以boost::mutex
在分配器的使用周围添加一个锁)并且它们是工厂类的成员(并且destroy
' 的签名void (YourClass*)
通过使用 修改为boost::bind
)。
您还可以通过在 boost::shared_ptr 构造函数中直接绑定来避免编写两个额外的函数(destroy
和create
) 。object_pool<YourClass>::destroy
我现在懒得写了:)。
编辑(将我的答案评论移到此处以进行代码格式化):
绑定销毁函数:
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
实例被删除,传递给shared_ptr
实例的 this 指针将无效 - 并在shared_ptr
删除YourClass
实例时使您的应用程序崩溃)。
明显的解决方案:
创建您自己的make_shared
函数并强制使用此方法创建shared_ptr
。受此规矩者应受处罚。
笔记:
似乎与角色的角色混淆了shared_ptr
。它的作用是管理你分配的内存,但是这样做需要分配它自己的一些内存(计数器和删除器),因此你可以为它们传递一个分配器。
这些几乎是正交的问题。shared_ptr
不参与对象的分配。
它所关注的地方是删除不再引用的内存。如果您从默认堆以外的任何地方进行分配,则需要提供自定义删除器