Классика жанра

Jun 03, 2015 14:41



static inline void FREE(void* ptr) {
if (ptr != NULL) {
free(ptr);
ptr = NULL;
}
}

Leave a comment

Comments 19

feldgendler June 3 2015, 20:17:11 UTC

#define FREE free

Reply

contradictor June 3 2015, 21:03:25 UTC
Гм.. что это лечит?

Reply

feldgendler June 4 2015, 09:33:10 UTC
Ничего. Это просто 100% эквивалент тому, что написано в посте, хотя намерение автора было другое.

Reply

contradictor June 4 2015, 11:51:31 UTC
В этом смысле - да.

Reply


the_chiffa June 3 2015, 20:22:25 UTC
А вот если бы функция была определена как
static inline void FREE(void* const ptr )
все могло бы сложиться иначе!

Reply

contradictor June 3 2015, 21:04:37 UTC
Тогда компилятор просто ругнулся бы на третью строчку, полагаю.

Reply


yatur June 3 2015, 20:25:40 UTC
Мелкий пошел баг. Не эпичный. Да и не баг это вовсе. Компилятор же, небось, идиотское присваивание.
А что касается проверки на NULL - ну кто их знает - может, они миллионами NULL указатели освобождают в цикле. Сэкономил миллион вызовов free() - спас дерево. :)

Reply

contradictor June 3 2015, 21:11:15 UTC
Компилятор же, небось, идиотское присваивание.
...удалит при оптимизации? Пользователю функции от этого не легче. Не говоря уже о том, что в случае повторного вызова с тем же prt наверняка прилетит SIGSEGV.

Лично я, как пользователь, был уверен - это дифайн (ну капсом же, да и логика подсказывает). Стоило это мне два часа отладки и разочарования в людях...

Reply

yatur June 3 2015, 21:16:14 UTC
А, в этом смысле. Похоже, кому-то сказали, что дефайны зло, и их все надо заменить на инлайны. Ну он и заменил :)

Сделайте template и T*& ptr.

Reply

contradictor June 3 2015, 21:26:10 UTC
Я заменил на дифайн - так проще и быстрее. В коде для эмбеддед систем не слишком приветствуют темплейты - растет размер.

ЗЫ и да, хидер - где была определена функция - используется еще и в pure C, так что передача по ссылке не годится.

Reply


Leave a comment

Up