仅使用一个malloc作为完整的链接列表

时间:2015-10-26 11:51:36

标签: c++ list malloc singly-linked-list allocator

我正在编写一个程序,它将使用链表来分配内存。

目标是减少对malloc()功能的调用次数。

为此,我想象以下分配函数:(head(Slot<T>*)和free_slots(int)是分配器的一部分)

 inline T* allocate(size_t length)
{
    if(free_slots == 0){
        head = (Slot<T>*) malloc(length * sizeof(Slot<T>) * NBR_NEW_OBJECT);
        free_slots = NBR_NEW_OBJECT;
    }

    T* result = &(head->data);
    head = static_cast<Slot<T>* >(head->next);
    return result;
}

我定义了Slot结构:

template <typename T>
struct Slot{
   T data;
   Slot* next;
};

但是我们第二次进入allocate方法(第一次没问题)我有一个段错误。 你有什么想法吗?

1 个答案:

答案 0 :(得分:0)

似乎好方法是之前初始化所有Slot->next字段 所以正确的实施应该是:

inline T* allocate(size_t length)
{

    if(free_slots == 0){
        head = (Slot<T>*) malloc(length * sizeof(Slot<T>)  * NBR_NEW_OBJECT);
        free_slots = NBR_NEW_OBJECT;

        for(int i = 0; i < NBR_NEW_OBJECT; i++)
                head[i].next = reinterpret_cast<Slot<T>* >(&head[i+1]);

    }

    T* result = &(head->data);
    head = reinterpret_cast<Slot<T>* >(head->next);
    free_slots--;
    return result;
}