Проектируемый C API для увеличения буфера принимает выходные параметры char **buffer и size_t *capacity, предоставленные вызывающей стороной. Предположим, что *buffer владеет действительным выделенным блоком, а запрошенный размер строго положителен и превышает текущую ёмкость.
Прямое присваивание результата realloc в *buffer при неудаче выделения заменит единственный владеющий указатель нулевым. Согласно проекту C11, при такой неудаче прежний объект остаётся неизменным и выделенным. API потеряет доступ к памяти, которую по-прежнему нужно освободить.
Временный указатель задаёт понятную границу обновления. При неудаче сообщаем об ошибке выделения и сохраняем оба выходных параметра. При успехе передаём возвращённый указатель и новую ёмкость. Успешная замена также завершает время жизни прежнего объекта, поэтому сохранёнными указателями на него нельзя продолжать пользоваться лишь потому, что возвращённый адрес случайно совпал.
Достаточно ли результата об успехе или неудаче и этих правил обновления, если явно потребовать от вызывающей стороны заново получать указатели на содержимое после успеха?
