我想要一个使用此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
)。什么用作Deleter?或者有更好的方法来实现这一切吗?
答案 0 :(得分:2)
由于您让类的用户将分配器指定为类型参数,因此必须为 分配和取消分配引用此参数。出于这个原因,@ Kerrek所做的推荐(尽管使用指向函数的技巧很复杂)是无效的,因为你确实想使用作为参数传递的allocator方法。
使用unique_ptr可以为您服务。正如您正确评论的那样,您必须提供自己的删除器,并且根据我上面的注释,它必须基于作为模板传递给您的模板的分配器类。
SIDE注意:请注意模板声明中存在语法错误。请参阅下面的示例代码以获取正确的语法(即您必须拥有关键字“模板”):
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); } )
{
}
};
很少有事情需要注意: