[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