是allocator_traits :: deallocate有效的shared_ptr删除程序

时间:2018-10-31 01:04:08

标签: c++ shared-ptr allocator

我猜这个问题确实与std::allocator_traits的设计以及提供自定义分配器有关。如果要使用自定义分配器构造std::shared_ptr<>,可以使用std :: allocator_traits吗?

基本上,这是正确的吗?

WidgetAllocator allocator;
std::shared_ptr<Widget> widget(allocator.allocate(), std::allocator_traits<WidgetAllocator>::deallocate);

1 个答案:

答案 0 :(得分:2)

  

基本上,这是正确的吗?

std::shared_ptr<Widget> widget(allocator.allocate(), std::allocator_traits<WidgetAllocator>::deallocate);

那是不正确的。

首先,不能保证分配器具有无效的allocate成员函数。

好的,让我们假设WidgetAllocator确实提供了这样的重载,尽管这对于分配器而言并不是很典型。但更重要的是,std::allocator_traits::deallocate不可与Widget*一起调用。其参数列表为( Alloc& a, pointer p, size_type n )

  

那么allocator_traits的建议用法是什么?

无论何时要使用分配器的可选功能之一,例如std::allocator_traits,都应使用Alloc::is_always_equal,而您要使用的分配器都不使用提供可选功能,或者分配器是模板参数,并且您希望支持所有分配器,无论它们是否提供可选功能。

std::allocator_traits为分配器的可选功能提供默认实现。

  

我应该直接在分配器上调用方法吗?

如果使用的分配器提供成员函数,则 可以直接调用成员函数;对于一般情况,如果不是可选的,则可以调用成员函数。不过,不必直接调用成员,您可以始终使用分配器特征。