2010-11-21 2 views

ответ

32

Нет, не стоит. Стандартный 7.20.4.5 говорит:

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

Я считаю, что удаление выделено полужирным шрифтом.

+0

Да, на практике, если я вызываю char * tok = strtok(), его первым параметром является return getenv(). Strlen (tok) и puts (tok) tok) не будет работать ... Весьма связанный с проводкой результат. Я думаю, что это вызвано strtok(), покрываемым выделенным жирным шрифтом – ackratos

+1

Немного устаревшим, но страницы man linux говорят 'char * getenv()' а не 'const char * getenv()' .Я обнаружил это, потому что моя машина не была счастлива, когда я освобождал строку. Являются ли страницы man не совсем правильными? Я всегда был под впечатлением, когда fuction возвращает символ 'char * 'должен быть освобожден. ' – hetepeperfan

+0

@hetepeperfan Это не только страница man. Прототип функции для' getenv' действительно возвращает 'char *', а не 'const char *'. Возможно, интерфейс предшествует обычному использованию 'const', или возможно, это просто надзор, который слишком долго не касался. Согласился, что это вводит в заблуждение. – jdolan

7

Вы не должны освобождать его. Это фрагмент со страницы man:

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

Не трогайте его!

7

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

Если в документации явно указано, что вы можете освободить указатель, вы не должны.

+0

Я не уверен в общем, но в системах POSIX нет необходимости хранить строку, если ваша программа не изменяет среду. Указатель возвращает точки непосредственно во внутреннюю копию, а не временный буфер. –

+0

@R, это документы [say] (http://www.opengroup.org/onlinepubs/009695399/functions/getenv.html) «Возвращаемое значение из getenv() может указывать на статические данные, которые могут быть перезаписаны последующими вызывает getenv() [...] ". Таким образом, он может измениться, даже если нет вызовов 'putenv'. –

+0

Этот язык был удален в выпуске 7, но он по-прежнему утверждает, что функция не является потокобезопасной. Я полагаю, что только строго санкционированный поточно-безопасный способ доступа к окружающей среде через «extern char ** environ;» ... –

4

Нельзя удалять его. Getenv просто получает значение из массива char * (char ** environ, если я правильно помню), который содержит каждую переменную среды. Удаление их приводит к неопределенному поведению.

2

Возможно, лучшая причина в том, что стандарт не говорит, что вы можете. Просто потому, что функция возвращает указатель, это не означает, что указатель действителен для перехода на free. Если в документации функции не указано, что функция выделяет память «как бы путем вызова malloc» и возвращает указатель на эту память, вы должны предположить, что указатель недействителен для перехода на realloc или free.

Смежные вопросы