使用malloc()和free()实现一个简单的allocator类

时间:2018-03-24 15:59:25

标签: c++ c++11 memory memory-management malloc

这个分配器的简单实现是否可以接受

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功能是可疑的)

2 个答案:

答案 0 :(得分:1)

您的释放功能确实不正确。 freemalloc的规则很简单:您必须准确传递从mallocfree的指针。

template<typename T>
void Allocator<T>::deallocate(T* p, size_t)
{
    free(p);
}

请注意,您通常也应该将相同的指针 type 传递给释放函数,但在这种情况下,由于free仅将void*作为参数,因此隐式转换将照顾好。

答案 1 :(得分:0)

不,这不会起作用。

  • 你应该有rebind方法。

  • 您需要提供比较运算符(==!=

  • 您的allocate方法分配过多。当它到达你的时候,sizeof(T)已经发生了。

  • 您的deallocate方法错误。你得到一个指针。第二个参数是对分配大小的提示。

  • constructdestruct方法是可选的。如果您不提供,则allocator_traits将为您合成。

有关最小分配器的示例,请参阅https://github.com/llvm-mirror/libcxx/blob/5a424a985612452d4f7a3f02422207456d54a53e/test/support/min_allocator.h#L21(尽管没有rebind