Каковы общие правила владения памятью для возврата указателей из функций POSIX? - PullRequest
0 голосов
/ 30 сентября 2018

Сегодня я пытался вызвать функцию strerror POSIX.Он возвращает char*, и теперь я не уверен, free это или нет free.

Приложение не должно изменять возвращаемую строку.

Я думаю, что возвращаемый указатель должен быть указателем на внутренний статический буфер, и в этом случае я никогда не должен его трогать.Но он просто говорит «не изменять» и вообще не говорит о владении памятью.Я сбиваю с толку.Я бы предположил, что «нет прикосновения», поскольку «система владеет, звонящий заимствует», но все же я не уверен, потому что это всего лишь мой вывод, а не обещание или определение.

Я не очень знаком с программированием на C / POSIX,Я думаю, что для этого должно быть хорошо установленное соглашение или явные правила, но я не смог их найти.

Что такое правило владения памятью для функций C / POSIX?

1 Ответ

0 голосов
/ 30 сентября 2018

Соглашение состоит в том, что вы не освобождаете указатель (или не пишете в него), если в описании функции, возвращающей его, не сказано, что вы должны освободить его.Тем не менее, идиома POSIX, чтобы выразить это немного странно, так что легко запутаться.

Например, для strdup и strndup это:

Возвращенный указатель может быть передан в free().[…] Дублирование предоставленных s в новом блоке памяти, выделенном, как будто с использованием malloc()

Для realpath, это так:

Если resolved_name является нулевым указателем, сгенерированный путь должен быть сохранен как строка с нулевым символом в конце в буфере, выделенном как бы при вызове malloc().

Сравните это с документациейgetaddrinfo или fopen, который не использует такой язык.Вместо этого ожидается, что вы будете использовать определенные функции освобождения (freeadrinfo и fclose).

Короче говоря, каждый раз, когда POSIX говорит, что указатель может быть передан free или указатель на память, выделенную так, как будто с помощью malloc(), это фактически означает, что вам нужно освободить этот указатель, если вы хотите избежать утечки памяти.В противном случае вам не разрешено освобождать указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...