gpt4 book ai didi

c++ - 为什么 C++14 中没有 std::allocate_unique 函数?

转载 作者:IT老高 更新时间:2023-10-28 22:25:15 31 4
gpt4 key购买 nike

为什么 shared_ptr 有 allocate_shared 而 unique_ptr 没有 allocate_unique?
我想使用我自己的分配器创建一个unique_ptr:我必须自己分配缓冲区然后将它分配给一个unique_ptr吗?
这似乎是一个明显的习语。

最佳答案

do I have to allocate the buffer myself and then assign it to a unique_ptr?

不仅仅是一个缓冲区,一个指向对象的指针。但是对象可能需要被分配器销毁,内存肯定需要被分配器释放,所以你还需要将unique_ptr传递给分配器。它不知道如何使用分配器,因此您需要将其包装在自定义删除器中,这将成为 unique_ptr 类型的一部分。

我认为一个通用的解决方案应该是这样的:

#include <memory>

template<typename Alloc>
struct alloc_deleter
{
alloc_deleter(const Alloc& a) : a(a) { }

typedef typename std::allocator_traits<Alloc>::pointer pointer;

void operator()(pointer p) const
{
Alloc aa(a);
std::allocator_traits<Alloc>::destroy(aa, std::addressof(*p));
std::allocator_traits<Alloc>::deallocate(aa, p, 1);
}

private:
Alloc a;
};

template<typename T, typename Alloc, typename... Args>
auto
allocate_unique(const Alloc& alloc, Args&&... args)
{
using AT = std::allocator_traits<Alloc>;
static_assert(std::is_same<typename AT::value_type, std::remove_cv_t<T>>{}(),
"Allocator has the wrong value_type");

Alloc a(alloc);
auto p = AT::allocate(a, 1);
try {
AT::construct(a, std::addressof(*p), std::forward<Args>(args)...);
using D = alloc_deleter<Alloc>;
return std::unique_ptr<T, D>(p, D(a));
}
catch (...)
{
AT::deallocate(a, p, 1);
throw;
}
}

int main()
{
std::allocator<int> a;
auto p = allocate_unique<int>(a, 0);
return *p;
}

关于c++ - 为什么 C++14 中没有 std::allocate_unique 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23130712/

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