Подтвердить что ты не робот

Должен ли я освободить/удалить char *, возвращенный getenv()?

 char * val;                                                                        
 val = getenv("ENV_VAR_NAME");

выше - это код для получения переменной окружения, может ли это вызвать утечку памяти, если я не освобожу память, полученную getenv (char *)? Если нет, то ответьте, почему?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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