Как определить, должен ли указатель на возвращаемый символ быть свободным в функциях стандартной библиотеки 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()
, Если они используют динамическую память или другие ресурсы, которые нуждаются в очистке, у них будет функция для этой цели - деструктор, если вы захотите, который вы должны вызвать вручную.