我应该释放/删除getenv()返回的char *吗?

时间:2010-11-21 12:30:08

标签: c std

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

上面是获取环境变量的代码,如果我不释放getenv(char *)返回的内存,它会导致内存泄漏吗?如果没有那么请回答原因?

5 个答案:

答案 0 :(得分:36)

不,你不应该。标准7.20.4.5说:

  

getenv函数返回一个指针   到与...相关的字符串   匹配清单成员。 字符串   指向不得修改   程序,但可能会被覆盖   随后打电话给getenv   功能

我认为删除内容以粗体显示。

答案 1 :(得分:8)

你不应该释放它。这是手册页中的一个片段:

  

通常实现时,getenv()返回指向环境列表中字符串的指针。来电者必须注意不要      修改此字符串,因为这会改变进程的环境。

请勿触摸它!

答案 2 :(得分:8)

没有。您无法控制其存储空间。通常,它是指向多次重用的静态数组的指针。出于这个原因,如果您计划将其存储以供以后使用,复制它(您应确保正确释放此副本)。

除非文档明确说明你可以释放指针,否则你不应该。

答案 3 :(得分:4)

你不应该删除它。 Getenv只从char *数组中获取一个值(char ** environ,如果我没记错的话),它包含每个环境变量。删除它们会导致未定义的行为。

答案 4 :(得分:2)

可能最好的理由是标准没有说你可以。仅仅因为函数返回指针并不意味着指针有效传递给free。除非函数的文档特别指出函数分配内存“好像通过调用malloc”并返回指向该内存的指针,否则必须假定指针无效传递给realloc或{ {1}}。