Программирование развивалось с момента его создания - это просто то, чего не было с рассвета C, но с тех пор оно развивалось и в других языках. Мне особенно нравится способ, которым target-c обрабатывает это, возвращая строковый объект, который был автоматически освобожден (то есть он будет автоматически освобожден позже, после того, как объект вышел из области видимости). Вы можете реализовать нечто подобное в C, если хотите:
- создать пул для временных выделений вне основного цикла
- выделять из пула по мере необходимости, используя вашу собственную функцию выделения
- периодически освобождайте пул на мелком уровне в вашем стеке вызовов (например, один раз за цикл в вашем самом внешнем главном цикле)
Еще один способ добиться того же, но позволяющий вам использовать системные функции, которые используют malloc для выделения памяти:
- вне вашего основного цикла создайте список (изначально пустой) объектов 'to-be-free'
- написать функцию с именем «autofree», которая добавляет указатели в список и возвращает указатель
- всякий раз, когда вам нужно использовать его следующим образом:
printf("%s\n", autofree(itos(5)));
- каждый раз вокруг вашего основного цикла, освобождать все указатели в списке и очищать список
Если вы сделаете это хорошим способом, вы можете создать несколько таких пулов с автоматическим освобождением и размещать их вокруг внутренних циклов, которые потенциально создают много выделений, которые вы хотите освободить раньше, а не обратно в основной цикл.