gpt4 book ai didi

c++ - 是 allocator_traits::deallocate 一个有效的 shared_ptr 删除器

转载 作者:行者123 更新时间:2023-11-28 01:27:40 26 4
gpt4 key购买 nike

我想这个问题真的是关于 std::allocator_traits 的设计的并提供自定义分配器。如果我想构造一个 std::shared_ptr<>使用自定义分配器,我可以使用 std::allocator_traits 吗?

基本上,这是正确的吗?

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

最佳答案

Basically, is this correct?

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 )

So what's the recommended use of allocator_traits?

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

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

Should I be invoking methods on the allocator directly?

可以直接调用成员函数,如果您使用的分配器提供它们,或者在一般情况下,如果它们是非可选的。不过,直接调用成员不是必需的,您始终可以使用分配器特征。

关于c++ - 是 allocator_traits::deallocate 一个有效的 shared_ptr 删除器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53074865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com