使用typedef从分配器创建shared_ptr?

时间:2011-09-18 04:16:46

标签: c++ pointers shared-ptr allocator

我有一些代码可以直接使用allocator代替operator newoperator delete进行改造。此代码的公共接口的一部分是返回不是光头指针而是返回shared_ptr(由从new移出的光头指针构造。)

我在公共合同中看到一个分配器有几个名为pointerconst_reference等的typedef。这个想法不是直接引用类型T *,我可能会使用{{1允许分配器作者滑入C指针以外的其他东西。

但我反过来将正常指针包装在智能指针中,这需要一个诚实的C指针(我想。)如果我尝试将代码更改为使用分配器的typedef,我会遇到麻烦吗?我还没有尝试(因为有一些腿部工作只是为了尝试)所以我先问...

编辑:以下是我想改变的一些代码(我没有第一次包含,因为它不是很友好。)

pointer

特别是,调用template<typename Injector, typename Iface, typename Allocator, typename Impl, typename A1> class New<Injector, Iface, Allocator, Impl, Impl(A1)>: public Binding<Injector> { public: static Impl * provide(Injector const & injector) { SAUCE_SHARED_PTR<A1> a1(injector.template provide<A1>()); return initializer(injector).template construct<Impl, SAUCE_SHARED_PTR<A1> >(a1); } static void dispose(Injector const & injector, Iface * iface) { Impl * impl = static_cast<Impl *>(iface); initializer(injector).destroy(impl); } }; // Elsewhere template<typename Iface> SAUCE_SHARED_PTR<Iface> provide() const { Iface * provided = provideFromBinding<Iface>( Module::template bindings<Injector_> ); SAUCE_SHARED_PTR<Iface> smartPointer; smartPointer.reset(provided, deleter); return smartPointer; } 表达式结果的constructdestroy模板方法目前直接使用了initializer(injector)new。我希望使用delete代替,并将它们切换到展示位置new / explicit destroy,以制作类似

的内容
Allocator

问题是,我应该尝试尊重分配器的typedef吗?看起来我应该是或者我没有正确使用分配器(更不用说务实地说几乎所有这些都将具有“无聊的”typedef值。)

我可以肯定地跳到它template<typename Injector, typename Iface, typename Allocator, typename Impl, typename A1> class New<Injector, Iface, Allocator, Impl, Impl(A1)>: public Binding<Injector> { public: static Impl * provide(Injector const & injector) { SAUCE_SHARED_PTR<A1> a1(injector.template provide<A1>()); Allocator allocator; Impl * impl = allocator.allocate(sizeof(Impl)); initializer(injector).template construct<Impl, SAUCE_SHARED_PTR<A1> >(impl, a1); return impl; } static void dispose(Injector const & injector, Iface * iface) { Allocator allocator; Impl * impl = static_cast<Impl *>(iface); initializer(injector).destroy(impl); allocator.deallocate(impl, sizeof(Impl)); } }; 而不是Allocator::pointer,直到我试图把它推到Impl *。也许它只是在那里工作?这是我的问题。也许比我更熟悉标准的人可能会说“只要shared_ptr嘎嘎叫Allocator::pointer并且你注册了一个自定义删除器,你会没事的。”

编辑: @bdonlan提出了一个很好的观点,即operator*模仿的是shared_ptr,而不是Allocator::value_type。相反,它可能在内部持有Allocator::pointer。这似乎回答了这个问题,除了分配器作者可能会选择在他们的Allocator::value_type *上实现operator Allocator::value_type *,即使使用转换后的值,它也会根据某些具体情况“全部解决” - 语义。

标准是否要求分配者作者执行此操作?

编辑:请参阅related.

1 个答案:

答案 0 :(得分:0)

shared_ptr(以及其他TR1智能指针)根据元素类型定义(即采用模板参数),指针类型。因此,如果您使用shared_ptr,则无法替换自己的指针表示;在大多数情况下这样做也没有意义。