char * val;
val = getenv("ENV_VAR_NAME");
上面是获取环境变量的代码,如果我不释放由getenv(char*)返回的内存,是否会导致内存泄漏?如果不会,请解释原因。
不要释放它。这是手册页面的一部分:
通常情况下,getenv() 返回环境列表中的字符串指针。调用者必须注意不要修改这个字符串,因为那样会改变进程的环境。
请勿触碰!
不,你不能控制它的存储。通常情况下,它是指向静态数组的指针,该数组会被多次重复使用。因此,如果你计划将其存储以供以后使用,你应该复制它(你应该确保这个副本被正确释放)。
除非文档明确说明可以释放指针,否则你不应该这样做。
putenv
调用,它也可能会发生变化。 - Matthew Flaschenextern char **environ;
... - R.. GitHub STOP HELPING ICEenviron
是解决方案,因为它说,“符合要求的应用程序不能直接修改environ。”我不确定为什么还没有getenv_r
调用。 - Matthew Flaschen不应该删除它。Getenv只是从一个char*数组(如果我记得正确的话,是char** environ)中获取一个值,该数组包含每个环境变量。删除它们会导致未定义的行为。
free
。除非一个函数的文档明确说明该函数分配内存“就像调用malloc
一样”并返回指向该内存的指针,否则您必须假定该指针无效,不能传递给realloc
或free
。
char* getenv()
而不是const char* getenv()
。我发现这一点是因为我的机器对我释放字符串并不太满意。难道man页面不完全正确吗?我一直以为当一个函数返回一个char*
时,应该释放它。 - hetepeperfangetenv
函数原型确实返回char *
而不是const char *
。也许这个接口早于const
的普及,或者可能只是一个长期未被解决的疏忽。同意它是具有误导性的。 - jdolan