Как определить, должен ли указатель на возвращаемый символ быть свободным в функциях стандартной библиотеки C?

У меня мало опыта в C разработка программы. Как я описал в заголовке, как определить, должен ли указатель на возвращаемый символ быть свободным в функциях стандартной библиотеки C? Например, нужно ли освободить указатель возврата функции getenv в stdlib.h а также strstr в string.h? Я не могу найти описание в документе.

Заранее спасибо.

6 ответов

Решение

http://en.cppreference.com/w/cpp/utility/program/getenv

Изменение строки, возвращаемой getenv, вызывает неопределенное поведение.

Так что не стоит прикасаться к этому.

http://en.cppreference.com/w/cpp/string/byte/strstr

Возвращаемое значение: указатель на первый символ найденной подстроки в str.

Это возвращает указатель на символ во входной c-строке. Так что это указатель на память, которая уже существует, а не вновь выделенная строка, и вы не должны free Это.

ps Хотя это не меняет ответа, я взял точку зрения на тег C++ этого вопроса. Документацию по языку C см. На страницах справочника или для этого веб-сайта http://en.cppreference.com/w/c/program/getenv и http://en.cppreference.com/w/c/string/byte/strstr (который имеет по существу то же содержание, что и выше)

Каждая функция должна отметить это на своей странице руководства.

Например getenv() ничего не говорит об удалении, и это действительно не нужно (или было бы неправильно). vasprintf()с другой стороны, четко указывает, что возвращаемый указатель должен быть free()"D.

В gnu/linux введите man strstr (или выполните поиск с помощью предпочитаемой вами системы веб-поиска).

Страница руководства дляgetenv также говорится:

Функция getenv() осуществляет поиск в списке среды, чтобы найти имя переменной среды, и возвращает указатель на соответствующую строку значения.

Идея дизайна здесь и вC в целом состоит не в том, чтобы делать какие-либо необходимые копии, а в том, чтобы указывать на уже существующие данные по соображениям производительности.

Контрпримером являетсяstrdup, который делает копию строки, используя внутренне mallocи должен быть free()д.

Всегда оказывать free() какие malloc() и семья предстала перед тобой.

Семья calloc() а также realloc(),

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

Функции как fopen() вернуть указатель, который должен быть сдан, но fclose() не free(),

Но, к сожалению, реальный ответ - "проверь документацию и знай свои библиотеки".

Факт кодирования на C заключается в том, что вы почти полностью отвечаете за управление ресурсами, в том числе точно знаете, какие ресурсы и когда сдавать.

Это сила и проклятие C. Ура, вы контролируете! Sh* т! Вы контролируете

Например, глядя на Человека гетена, вы можете прочитать:

Заметки

[...] Как обычно реализовано, getenv() возвращает указатель на строку в списке среды. Вызывающий должен позаботиться о том, чтобы не изменять эту строку, так как это изменило бы среду процесса [...]

Акцент мой

А также

ОПИСАНИЕ

Функция getenv () ищет список среды, чтобы найти имя переменной среды, и возвращает указатель на> соответствующую строку значения.

Акцент мой

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

Правильно спроектированные библиотеки никогда не возвращают указатели, которые вы должны вручную free(), Если они используют динамическую память или другие ресурсы, которые нуждаются в очистке, у них будет функция для этой цели - деструктор, если вы захотите, который вы должны вызвать вручную.

Другие вопросы по тегам