[cdev] Дайджест списка рассылки cdev; том 3, выпуск 1
Grigoriy A. Sitkarev
sitkarev на komitex.ru
Чт Апр 1 15:01:16 MSK 2010
lenad89 пишет:
> и еще вот (это скорее всего опечатка):
>
> memset(queue->heap + OLD_SIZE(queue), 0,
> NEW_SIZE(queue) - OLD_SIZE(queue));
> queue->size += GROW_SIZE;
> queue->heap = tmp;
> - не верно, нужно поставить queue->heap = tmp перед memset ;
>
> У тебя указатель queue->heap указывает на старый блок памяти, а новый
> лежит по указателю tmp. Т.е. ты чистишь старую память(за пределами этой
> памяти), в не новую. Нужно поместить queue->heap адрес нового участка и
> потом уже его использовать.
Это моя опечатка была и я посылал к ней исправление в виде патча. Почему
то Алексей не заметил её (или забыл).
http://wiki.syktsu.ru/pipermail/cdev/2010-March/000016.html
http://wiki.syktsu.ru/pipermail/cdev/2010-March/000017.html
И ещё.
У Лёши в API (объявления даны в queue.h) функция prioq_free() была
объявлена так:
void prioq_free(strict prioq **queue)
И ей передаётся указатель на указатель на структуру очереди. Почему
именно указатель на указатель, с какой целью? Только с одной - чтобы
функция занулила сам указатель и им никто не смог воспользоваться
(ошибочно) после освобождения.
Как минимум, надо проверить сначала валидность **queue потом *queue и
лишь потом высвободить ресурсы. А затем и занулить сам *queue.
Если бы мы передавали просто *queue, то мы конечно можем сделать так:
queue = NULL;
Но т.к. в функцию передаются копии значений (в данном случае queue будет
локальной переменной в которой хранится адрес структуры очереди) то
нужного эффекта мы не получим, потому что нам нужно занулить именно
указатель которым пользуется пользователь.
Поясню на примере:
Если у нас prioq_free работает с указателем, то все изменения этого
указателя внутри неё - локальны.
void prioq_free(struct prioq *queue);
struct prioq *queue;
...
prioq_free(queue);
/* Указатель queue никогда не изменится после вызова prioq_free */
А здесь мы передадим сам адрес где хранится указатель, тогда мы его
сможем изменить внутри prioq_free.
void prioq_free(struct prioq **queue);
struct prioq *queue;
...
prioq_free(&queue);
/* Здесь prioq_free может изменить значение queue */
--
Г.А.
Подробная информация о списке рассылки cdev