【发布时间】:2010-11-21 12:30:08
【问题描述】:
char * val;
val = getenv("ENV_VAR_NAME");
上面是获取环境变量的代码,如果我不释放 getenv(char*) 返回的内存会导致内存泄漏吗?如果不是,请回答为什么?
【问题讨论】:
char * val;
val = getenv("ENV_VAR_NAME");
上面是获取环境变量的代码,如果我不释放 getenv(char*) 返回的内存会导致内存泄漏吗?如果不是,请回答为什么?
【问题讨论】:
不,你不应该。标准 7.20.4.5 说:
getenv 函数返回一个指针 到与 匹配的列表成员。 字符串 所指出的不得修改 程序,但可能被 随后调用 getenv 功能。
我相信粗体字已经涵盖了删除。
【讨论】:
char* getenv() 而不是 const char* getenv()。我发现了这一点,因为我的机器对我释放字符串不满意。手册页不完全正确吗?当函数返回 char* 时,我总是觉得应该释放它。?
getenv 的函数原型确实返回 char * 而不是 const char *。也许该界面早于const 的常见用法,或者它可能只是一个长期未解决的疏忽。同意这是误导性的。
你不应该释放它。这是手册页中的 sn-p:
正如通常实现的那样,getenv() 返回一个指向环境列表中的字符串的指针。来电者必须注意不要 修改这个字符串,因为那会改变进程的环境。
别碰它!
【讨论】:
没有。您无法控制其存储。通常,它是一个指向多次重用的静态数组的指针。出于这个原因,如果您打算存储它以供以后使用,您应该复制它(您应该确保正确释放此副本)。
除非文档明确说明您可以释放指针,否则您不应该这样做。
【讨论】:
putenv 调用它也可以改变。
extern char **environ;...
environ 是解决方案,因为它说,“要求符合要求的应用程序不要直接修改环境。”我不知道为什么仍然没有getenv_r 电话。
你不应该删除它。 Getenv 只是从包含每个环境变量的 char* 数组(char** environ,如果我没记错的话)中获取一个值。删除它们会导致未定义的行为。
【讨论】:
可能最好的原因是标准没有说你可以。仅仅因为函数返回一个指针并不意味着该指针可以有效地传递给free。除非函数的文档明确说明该函数“好像通过调用 malloc”分配内存并返回指向该内存的指针,否则您必须假定该指针无效以传递给 realloc 或 free。
【讨论】: