gpt4 book ai didi

c++ - 在 C++ 中使用 std::unique_ptr 管理原始内存

转载 作者:行者123 更新时间:2023-11-30 04:24:54 26 4
gpt4 key购买 nike

我想要一个用这个 API 管理原始内存的小类

template<class allocator = std::allocator<char> >
class raw_memory
{
static_assert(std::is_same<char, typename allocator::value_type>::value,
"raw_memory: allocator must deal in char");
public:
raw_memory() = default;
raw_memory(raw_memory&&) = default;
raw_memory&operator=(raw_memory&&) = default;
explicit raw_memory(size_t, allocator const& = allocator());
~raw_memory(); // deletes any memory
char*get(); // returns pter to (begin of) memory
void resize(size_t); // re-allocates if necessary, may delete old data
size_t size() const; // returns number of bytes currently hold

raw_memory(raw_memory const&) = delete;
raw_memory&operator=(raw_memory const&) = delete;
raw_memory(raw_memory&) = delete;
raw_memory&operator=(raw_memory&) = delete;
};

模板参数allocator允许不同的内存对齐选项。

我正在考虑使用 std::unique_ptr<char, Deleter> ,作为成员(或基数)(加上 size_t 保存字节数)。使用什么作为删除器?还是有更好的方法来实现这一切?

最佳答案

由于您让您的类的用户将分配器指定为类型参数,因此您必须为分配和释放分配引用此参数。出于这个原因,@Kerrek 提出的建议(尽管函数指针的使用很棘手且很好)是无效的,因为您确实想使用作为参数传递的分配器方法。

使用 unique_ptr 可以为您工作。正如您正确评论的那样,您必须提供自己的删除器,并且根据我上面的评论,它必须基于作为参数传递给模板的分配器类。

旁注:请注意您的模板声明中存在语法错误。请参阅下面我的示例代码以了解正确的语法(即您必须具有关键字"template"):

template< class A = std::allocator<char> >
class raw_memory
{
private:
A m_al;
std::unique_ptr< char, std::function<void(char*)> > m_buffer;

public:
raw_memory( size_t size, const A& al = A() )
:m_al(al)
,m_buffer( m_al.allocate(size), [this, size](char* ptr){ m_al.deallocate(ptr,size); } )
{
}
};

注意事项:

  • 我使用 A 作为类型参数(我发现将所有大写字母用于模板参数更具可读性)。
  • 使用 c++11 Lambda 表示法,我将删除仿函数传递给 unique_ptr 的构造函数。这个仿函数有一个闭包状态(对 al 的引用和大小),它将在删除期间使用。在闭包中,我放置了 this 指针(需要访问 m_al)和大小 - 均按值。

关于c++ - 在 C++ 中使用 std::unique_ptr 管理原始内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12456793/

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