Я думаю, что ваша идея, что "многие" функции в POSIX возвращают указатели таким образом, ошибочна.Ваш пример, inet_ntoa
это не в POSIX и был намеренно исключен из-за того, что он устарел и не работает.
Количество стандартных функций, которые возвращают указатели на выделенную память, на самом деле довольно мало, и большинствоиз тех, которые предоставляют специальную дополнительную функцию, которую вы должны использовать для освобождения памяти (например, fopen
и fclose
, getaddrinfo
и freeaddrinfo
или regcomp
и regfree
),Простой вызов free
для возвращенного указателя был бы очень плохим;в лучшем случае вы столкнетесь с серьезными утечками памяти, а в худшем случае это может привести к неожиданным сбоям (например, если библиотека хранит объекты, выделенные ей в связанном списке).системной библиотеки или сторонней библиотеки, она должна документировать ожидаемое использование любых указателей, которые она возвращает (и необходимо ли / как их освобождать).Для стандартных функций лучшим справочником по этому вопросу является сам POSIX .Вы также можете проверить справочные страницы для вашей конкретной системы.Если код является частью сторонней библиотеки, он должен поставляться с документацией (возможно, на страницах руководства, в заголовочных файлах или во всеобъемлющем документе по использованию библиотеки).Хорошо написанная библиотека будет предоставлять специальные функции для освобождения объектов, которые она выделяет, чтобы избежать введения зависимостей от того, как (в настоящее время) она реализована в коде, использующем библиотеку.
Что касается нестандартных inet_ntoa
и аналогичные устаревшие функции идут, они возвращают указатели на внутренние статические буферы.Это делает их непригодными для использования с потоками или в коде библиотеки (который должен позаботиться о том, чтобы не разрушить состояние вызывающей стороны, если это не задокументировано как это).Часто в документации для таких функций говорится, что они не обязаны быть поточно-ориентированными , что они не являются повторно входящими или что они могут возвращать указатель на внутреннийстатический буфер, который может быть перезаписан последующими вызовами функции .Многие, включая меня, считают, что такие функции вообще не должны использоваться в современном коде.