这个分配器的简单实现是否可以接受
template<typename T>
class Allocator
{
public:
T * allocate(int n); //allocate space for n objects of type T
void deallocate(T* p, int n); //deallocate n objects of type T starting at p
void construct(T* p, const T& v); //construct a T with the value v in p
void destroy(T* p); //destroy the T in p
};
template<typename T>
T* Allocator<T>::allocate(int n)
{
T* new_mem = (T*)malloc(n * sizeof(T));
return new_mem;
}
template<typename T>
void Allocator<T>::construct(T* p, const T& v)
{
T* constructed_object = new(p) T{ v };
}
template<typename T>
void Allocator<T>::deallocate(T* p, int n)
{
for (int i = 0; i < n; ++i)
{
free(&p[i]);
}
}
template<typename T>
void Allocator<T>::destroy(T* p)
{
p->~T();
}
我在向量中使用它来实现保留exra空间的函数,如下所示:
template<typename T, typename A>
void vector<T, A>::reserve(int newalloc)
{
if (newalloc <= space)return;
T* p = alloc.allocate(newalloc);
for (int i = 0; i < sz; ++i)alloc.construct(&p[i], elem[i]);
for (int i = 0; i < sz; ++i)alloc.destroy(&elem[i]);
elem = p;
space = newalloc;
}
其中typename A = Allocator<T>
和alloc
的类型为A
。
我实现的分配器类是否足以运行?
(我觉得deallocate
功能是可疑的)
答案 0 :(得分:1)
您的释放功能确实不正确。 free
和malloc
的规则很简单:您必须准确传递从malloc
到free
的指针。
template<typename T>
void Allocator<T>::deallocate(T* p, size_t)
{
free(p);
}
请注意,您通常也应该将相同的指针 type 传递给释放函数,但在这种情况下,由于free
仅将void*
作为参数,因此隐式转换将照顾好。
答案 1 :(得分:0)
不,这不会起作用。
你应该有rebind
方法。
您需要提供比较运算符(==
和!=
)
您的allocate
方法分配过多。当它到达你的时候,sizeof(T)
已经发生了。
您的deallocate
方法错误。你得到一个指针。第二个参数是对分配大小的提示。
construct
和destruct
方法是可选的。如果您不提供,则allocator_traits
将为您合成。
有关最小分配器的示例,请参阅https://github.com/llvm-mirror/libcxx/blob/5a424a985612452d4f7a3f02422207456d54a53e/test/support/min_allocator.h#L21(尽管没有rebind
)