¿Debo liberar / eliminar char * devuelto por getenv ()?


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

Arriba hay un código para obtener la variable de entorno, ¿causará una fuga de memoria si no libero la memoria devuelta por getenv(char*) ? En caso negativo, por favor responda por qué.

 24
Author: SunnyShah, 2010-11-21

5 answers

No, no deberías. La norma 7.20.4.5 dice:

La función getenv devuelve un puntero a una cadena asociada con el miembro de la lista coincidente. La cadena apuntado no se modificará por el programa, pero puede ser sobrescrito por una llamada posterior al getenv función.

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

 33
Author: icecrime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-21 12:34:16

No. No controlas su almacenamiento. Por lo general, es un puntero a una matriz estática que se reutiliza varias veces. Por esta razón, debe copiarlo si planea almacenarlo para su uso posterior (debe asegurarse de que esta copia se libere correctamente).

A menos que la documentación diga explícitamente que puede liberar un puntero, no debe hacerlo.

 7
Author: Matthew Flaschen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-21 12:32:39

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

Como se suele implementar, getenv() devuelve un puntero a una cadena dentro de la lista de entorno. La persona que llama debe tener cuidado de no modifique esta cadena, ya que eso cambiaría el entorno del proceso.

¡No lo toques !

 7
Author: Nicolas Viennot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-21 12:36:42

No deberías borrarlo. Getenv solo obtiene un valor de una matriz char * (char * * environ, si no recuerdo mal), que contiene cada variable de entorno. Eliminarlos causa un comportamiento indefinido.

 4
Author: Raveline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-21 12:34:43

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

 2
Author: R..,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-21 12:48:39