Соглашение состоит в том, что вы не освобождаете указатель (или не пишете в него), если в описании функции, возвращающей его, не сказано, что вы должны освободить его.Тем не менее, идиома POSIX, чтобы выразить это немного странно, так что легко запутаться.
Например, для strdup
и strndup
это:
Возвращенный указатель может быть передан в free()
.[…] Дублирование предоставленных s в новом блоке памяти, выделенном, как будто с использованием malloc()
Для realpath
, это так:
Если resolved_name является нулевым указателем, сгенерированный путь должен быть сохранен как строка с нулевым символом в конце в буфере, выделенном как бы при вызове malloc()
.
Сравните это с документациейgetaddrinfo
или fopen
, который не использует такой язык.Вместо этого ожидается, что вы будете использовать определенные функции освобождения (freeadrinfo
и fclose
).
Короче говоря, каждый раз, когда POSIX говорит, что указатель может быть передан free
или указатель на память, выделенную так, как будто с помощью malloc()
, это фактически означает, что вам нужно освободить этот указатель, если вы хотите избежать утечки памяти.В противном случае вам не разрешено освобождать указатель.