2010-11-21 15 views

Respuesta

32

No, no deberías. 7.20.4.5 norma dice:

La función getenv devuelve un puntero a una cadena asociado con el miembro de lista de coincidencias . La cadena apuntada no debe ser modificada por el programa, pero puede sobrescribirse por una llamada subsiguiente a la función getenv .

Creo que la eliminación está cubierta por el texto en negrita.

+0

Sí, en la práctica, si llamo a char * tok = strtok() con su primer parámetro, se devuelve getenv(). The strlen (tok) y puts (tok) no funcionará ... Un resultado bastante cableado. Creo que fue causado por strtok() está cubierto por el texto en negrita. – ackratos

+1

Un poco desactualizado, pero las páginas del manual de linux dicen 'char * getenv()' y no 'const char * getenv()'. Descubrí esto ya que mi máquina no estaba feliz de que yo liberara la cadena. ¿Las páginas man no son completamente correctas? Siempre tuve la impresión de que cuando una fábrica devuelve un 'char * 'uno debería liberarlo.? – hetepeperfan

+0

@hetepeperfan No es solo la página man. El prototipo de función para' getenv' de hecho devuelve 'char *' y no 'const char *'. Tal vez la interfaz es anterior al uso común de 'const', o tal vez es solo un descuido que no fue abordado por mucho tiempo. Estoy de acuerdo en que es engañoso. – jdolan

7

No debe liberarlo. Este es un fragmento de la página man:

Como suele implementarse, getenv() devuelve un puntero a una cadena dentro de la lista de entornos. El llamante debe tener cuidado de no modificar esta cadena, ya que eso cambiaría el entorno del proceso.

¡No lo toques!

7

No. Usted no controla su almacenamiento. Normalmente, es un puntero a una matriz estática que se reutiliza varias veces. Por este motivo, usted debe copiarlo si planea almacenarlo para un uso posterior (debe asegurarse de que esta copia se libere correctamente).

A menos que la documentación indique explícitamente que puede liberar un puntero, no debería hacerlo.

+0

No estoy seguro en general, pero en los sistemas POSIX no sirve de nada almacenar la cadena a menos que su programa modifique el entorno. El puntero devolvió los puntos directamente a la copia interna, no a un buffer temporal. –

+0

@R, it the docs [say] (http://www.opengroup.org/onlinepubs/009695399/functions/getenv.html) "El valor de retorno de getenv() puede apuntar a datos estáticos que pueden ser sobrescritos por llama a getenv() [...] ". Por lo tanto, puede cambiar incluso si no hay llamadas 'putenv'. –

+0

Ese idioma se ha eliminado en el Issue 7, pero todavía afirma que la función no es segura para subprocesos. Supongo que la única manera estrictamente sancionada de acceso seguro al medio ambiente es mediante 'extern char ** environ; '... –

4

No debe eliminarlo. Getenv acaba de obtener un valor de una matriz char * (char ** environ, si no recuerdo mal), que contiene todas las variables de entorno. Eliminarlos causa un comportamiento indefinido.

2

Probablemente la mejor razón es porque el estándar no dice que usted puede. El hecho de que una función devuelva un puntero no significa que el puntero sea válido para pasar al free. A menos que la documentación de una función diga específicamente que la función asigna memoria "como si llamara al malloc" y devuelve un puntero a esa memoria, debe asumir que el puntero no es válido para pasar a realloc o free.

Cuestiones relacionadas