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

以上是获取环境变量的代码,如果我不释放 getenv(char*) 返回的内存,会导致内存泄漏吗?如果不是,请回答为什么?

4

5 回答 5

42

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

getenv 函数返回一个指向与匹配列表成员关联的字符串的指针。指向的字符串不应被程序修改,但可能会被后续调用 getenv 函数覆盖。

我相信粗体字涵盖了删除。

于 2010-11-21T12:34:16.750 回答
11

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

正如通常实现的那样,getenv() 返回一个指向环境列表中的字符串的指针。调用者必须注意不要修改这个字符串,因为那会改变进程的环境。

不要碰它!

于 2010-11-21T12:32:19.513 回答
9

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

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

于 2010-11-21T12:32:39.277 回答
5

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

于 2010-11-21T12:34:43.693 回答
2

可能最好的原因是标准没有说你可以。仅仅因为一个函数返回一个指针并不意味着该指针是有效的传递给free. 除非函数的文档明确说明该函数“好像通过调用malloc”来分配内存并返回指向该内存的指针,否则您必须假设该指针无效传递给reallocor free

于 2010-11-21T12:48:39.150 回答