26

我希望从池中分配由 shared_ptr 管理的对象,比如 Boost 的 Pool 接口,如何实现?

4

3 回答 3

21

这是执行您想要的代码(可能无法编译,因为我手头没有 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 构造函数中直接绑定来避免编写两个额外的函数(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实例被删除,传递给shared_ptr实例的 this 指针将无效 - 并在shared_ptr删除YourClass实例时使您的应用程序崩溃)。

于 2010-05-26T08:56:28.687 回答
4

明显的解决方案:

创建您自己的make_shared函数并强制使用此方法创建shared_ptr。受此规矩者应受处罚。

笔记:

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

于 2010-05-26T08:33:28.463 回答
1

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

它所关注的地方是删除不再引用的内存。如果您从默认堆以外的任何地方进行分配,则需要提供自定义删除器

于 2010-05-26T08:21:34.933 回答