На этот вопрос легче всего ответить, если мы перевернем его:
- Почему было бы неплохо, если бы каждый объект
malloc
'd в функции также был free
d в той же функции?
Ответ таков: не будет никаких утечек памяти или висящих указателей , и этот ценный результат достигается без взаимодействия с какой-либо другой функцией . В результате проще получить правильный код, а функция имеет простой интерфейс.
А что если функция вызывает malloc
, а не free
? Тогда должны быть правила о том, кто обязан освобождать память, когда это разрешено делать и когда требуется . Эти правила становятся частью интерфейса функции , и любой, кто вызывает функцию, должен либо обеспечить соблюдение правил, либо следовать им, либо, возможно, навязывать аналогичные правила для ее вызывающей (ей) программы и т.д. , Явное управление памятью добавляет сложности интерфейсам , и чем сложнее интерфейсы, тем легче допустить ошибку, которая приводит к ошибке памяти & mdash; а в C ошибка памяти может привести к аварийному завершению вашей программы.
К сожалению, иногда необходимо иметь объект, который (a) должен быть выделен во время выполнения и (b) должен пережить активацию функции, которая его выделяет. В таких случаях, даже если кажется, что это может быть плохой идеей, у нас нет другого выбора, кроме как сделать распределение, усложнить интерфейс и потребовать от вызывающего абонента правильного управления объектом.
(Один из более простых случаев - когда объект выделяется во время выполнения, но ему разрешено жить вечно. Но вы должны ограничить количество таких объектов, иначе у вас не хватит места.)