我希望从一个池分配一个shared_ptr管理的对象,比如Boost的Pool接口,怎么能实现呢?
答案 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
来避免编写两个额外函数(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
实例的this指针将无效 - 并且崩溃shared_ptr
删除shared_ptr
实例时的应用。
答案 1 :(得分:4)
明智的解决方案:
创建您自己的make_shared
函数并强制使用此方法创建shared_ptr
。那些源自“规则”的人将受到惩罚。
注意:
似乎与shared_ptr
的角色混淆了。它的作用是管理内存而不是你分配的内容,但是这样做需要自己分配一些(计数器和删除器),因此你可以为它们传递一个分配器。
答案 2 :(得分:1)
这几乎是正交问题。 shared_ptr
不参与分配对象。
涉及的内容删除内存不再被引用。如果您已从默认堆以外的任何内容分配,则需要provide a custom deleter