#c #инспекция_кода #memory #realloc
Написал свою обертку над realloc. Все ли здесь правильно? Может быть есть какие-то недочеты, которых я не заметил? #define qk_realloc(p, n) qk_realloc__(p, &p, n) /* ================================= [TEST] The qk_realloc__ function Функция изменяет размер блока памяти, на который указывает old. Если операция выполнена успешно, то old присваивается адрес нового блока памяти. Если операция не выполнилась, в куче выделяется НОВЫЙ блок памяти, в него копируется содержимое old, старые данные освобождаются и указателю old присваевает адрес нового блока памяти. Если память не может быть выделена и для нового блока, функция возвращает NULL, при этом входные данные не изменяются. ================================= */ void* qk_realloc__(void* old, void* const ptrToOld, const u32 n) { void* new = realloc(old, n); if (new != NULL) { return *((void**) ptrToOld) = new; } // Тут должно быть сообщение типа: "не удалось выполнить realloc(n)". new = qk_malloc(n); if (new != NULL) { memmove(new, old, n); free(old); return *((void**) ptrToOld) = new; } // И тут похожее сообщение... return NULL; }
Ответы
Ответ 1
Логика разработчика этой оболочки совершенно не ясна Зачем в функцию передается одновременно old и указатель на old (ptrToOld)? Если уж вы хотите передавать ptrToOld, то по нему можно получить и значение old. Зачем передавать old отдельно? Почему делается безусловное memmove(new, old, n);? А если новый размер больше старого? Также стандартный realloc разрешает передавать ему на вход нулевой указатель. Ваш memmove не учитывает эту возможность. Почему ptrToOld имеет такой странный тип - void* const? Почему этот тип не является указателем на указатель? Почему вы решили, что после неудачи realloc вы сможете сделать malloc? Теоретически, неудачи у realloc могут быть разные, но мы-то понимаем, что практически всегда неудача realloc - это просто нехватка памяти. Почему вы считаете, что если realloc не смог выделить память, то malloc сможет? *((void**) ptrToOld) - переинтрепретация памяти, возможно нарушение strict-aliasing. Почему memmove, а не memcpy? И чего именно вы пытались добиться? Первая мысль была в том, что эта оболочка призвана бороться с недостатками варианта p = realloc(p, ...), но она с ними никак не борется. Так в чем же тогда смысл?Ответ 2
Все ли здесь правильно? Всё неправильно. Начиная с того, что нет никакой нужды делать обёртки над хорошо себя зарекомендовавшими стандартными функциями. Я даже не буду смотреть в ваш код, ответьте на простой вопрос: зачем?
Комментариев нет:
Отправить комментарий