[cdev] Задача_6. гр 135

lenad89 lenad89 на list.ru
Пт Апр 2 15:31:21 MSK 2010


В prioq_peek и prioq_get одна и та же ошибка :
ты дважды разыменовываешь указатели(сначала один потом, второй) не
проверив их на NULL 
head = queue->heap[0];/* вдруг queue == NULL или queue->heap == NULL*/


и зачем 

if (queue == NULL) {
            ...
}
if (queue != NULL) {

…

}


тогда уж
if (queue == NULL) {
            ...
} else {

…

}

??? free(queue->heap[used]);
??? free(queue->heap[0]);

опять пытаешься в prioq_get освободить память которая пренадлежит
пользователю(причем статическую),тут нужно скорее всего просто уменьшить
used на 1 и queue->heap[used] = NULL (важен еще порядок этих операций),
при следующем вызове prique_put, туда поместится новый указатель.
при used == 1 тоже самое.



кстати есть такой баг(может быть только у меня, но такое было на двух
разных компьютерах), если добавить еще user_data и поместить его в
очередь (prioq_put), то программа валится с сообщением 

(*** glibc detected *** ./que: double free or corruption (out):
0x09431020 *** ) ./que -имя программы.

Но если увеличить INIT_SIZE , скажем на 1, то ошибки нет и программа
работает нормально.

Если закомментировать free(queue->heap),а INIT_SIZE оставить прежним,
то тоже завершается нормально, но с утечкой памяти.

Попробуй добавить еще пару записей и посмотреть как она работает.

p.s. : читай сообщения Григория Александровича и программу посмотри,
которую он тебе прислал.






Подробная информация о списке рассылки cdev