自定义(池)分配器与boost shared_ptr

时间:2010-05-26 08:14:26

标签: c++ boost shared-ptr allocator

我希望从一个池分配一个shared_ptr管理的对象,比如Boost的Pool接口,怎么能实现呢?

3 个答案:

答案 0 :(得分:21)

这是代码,你可以做你想做的事情(可能不会编译,因为我手头没有增强功能,而且我是从内存中编写的):

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函数都是同步的(您可以使用allocator添加boost::mutex锁)并且它们是工厂类的成员(并且destroy的签名被修改为{ {1}}使用void (YourClass*))。

您还可以通过在boost :: shared_ptr构造函数中直接绑定boost::bind来避免编写两个额外函数(destroycreate)。

我现在懒得写下这一切:)。

修改(在此处移动我的答案评论以进行代码格式化):

绑定销毁功能:

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实例的this指针将无效 - 并且崩溃shared_ptr删除shared_ptr实例时的应用。

答案 1 :(得分:4)

明智的解决方案:

创建您自己的make_shared函数并强制使用此方法创建shared_ptr。那些源自“规则”的人将受到惩罚。

注意:

似乎与shared_ptr的角色混淆了。它的作用是管理内存而不是你分配的内容,但是这样做需要自己分配一些(计数器和删除器),因此你可以为它们传递一个分配器。

答案 2 :(得分:1)

这几乎是正交问题。 shared_ptr不参与分配对象。

涉及的内容删除内存不再被引用。如果您已从默认堆以外的任何内容分配,则需要provide a custom deleter