Freeing malloc'ed memory from circular linked list

Заранее извиняюсь, если это невероятно тупой вопрос...

В настоящее время у меня есть кольцевой связный список. Количество узлов обычно остается статичным. Когда я хочу его пополнить, я выделяю некоторое количество узлов (например, 100000 или около того) и добавляю его. Эта часть работает нормально, когда я добавляю узлы по одному.

Я хочу попытаться распределить по блокам:

NODE *temp_node = node->next;
NODE *free_nodes = malloc( size_block * sizeof( NODE ) );
node->next = free_nodes;
for ( i = 0; i < size_block - 1; i++ ) {
    free_nodes[i].src = 1;
    free_nodes[i].dst = 0;
    free_nodes[i].next = &free_nodes[i+1];
}
free_nodes[size_block - 1].next = temp_node;

Список работает, пока я не пытаюсь ничего освободить (ошибка 'glibc detected: double free or corruption'). Интуитивно я думаю, что это потому, что освобождение не освобождает один узел, а обычный цикл пытается освободить его несколько раз (плюс освобождение всего блока, вероятно, портит все другие указатели на узлы, которые все еще существуют?), но:

  1. Может кто-нибудь объяснить мне, что происходит?
  2. Есть ли способ распределить узлы по блокам и не сломать вещи?

Цель этого в том, что я вызываю malloc сотни тысяч раз, и было бы неплохо, если бы все было быстрее. Если есть лучший способ обойти это, или я не могу ожидать, что это станет быстрее, я был бы признателен услышать это тоже. :)

5
задан user962158 24 September 2011 в 01:59
поделиться