【发布时间】:2012-09-09 12:34:12
【问题描述】:
我想要一个小类,用这个 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)。什么用作删除器?还是有更好的方法来实现这一切?
【问题讨论】:
-
将自定义删除器作为
raw_memory对象的一部分? -
如果你不需要分配器支持,你可以使用
std::unique_ptr<void, void(*)(void*)> p(std::malloc(n), std::free);。 -
我猜你的意思是
typename allocator::value_type? -
好的,只需将
std::free替换为myfree,并编写自己的处理函数来推断需要传递给free的原始地址的位置。您可以为一般情况编写自己的 cookie 类型标记,并在可用的情况下使用posix_memalign。 -
您不必强制用户传递以
char类型进行通信的分配器。符合要求的分配器有一个名为rebind的嵌套模板,它将生成一个分配器来处理您实例化rebind的任何类型。
标签: c++ memory memory-management c++11 unique-ptr