【问题标题】:Should I free/delete char* returned by getenv()?我应该释放/删除 getenv() 返回的 char* 吗?
【发布时间】:2010-11-21 12:30:08
【问题描述】:
 char * val;                                                                        
 val = getenv("ENV_VAR_NAME");

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

【问题讨论】:

    标签: c libc


    【解决方案1】:

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

    getenv 函数返回一个指针 到与 匹配的列表成员。 字符串 所指出的不得修改 程序,但可能被 随后调用 getenv 功能。

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

    【讨论】:

    • 是的,实际上,如果我调用 char * tok = strtok(),其第一个参数将返回 getenv()。 strlen(tok) 和 puts(tok) 将不起作用...一个相当连贯的结果。我认为它是由 strtok() 引起的,被粗体文本覆盖。
    • 有点过时了,但 linux 手册页说 char* getenv() 而不是 const char* getenv()。我发现了这一点,因为我的机器对我释放字符串不满意。手册页不完全正确吗?当函数返回 char* 时,我总是觉得应该释放它。?
    • @hetepeperfan 这不仅仅是手册页。 getenv 的函数原型确实返回 char * 而不是 const char *。也许该界面早于const 的常见用法,或者它可能只是一个长期未解决的疏忽。同意这是误导性的。
    【解决方案2】:

    你不应该释放它。这是手册页中的 sn-p:

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

    别碰它!

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我一般不确定,但在 POSIX 系统上,除非您的程序修改环境,否则存储字符串是没有用的。返回的指针直接指向内部副本,而不是临时缓冲区。
      • @R,它是文档say“getenv() 的返回值可能指向静态数据,这些数据可能会被后续对 getenv() 的调用覆盖 [...]”。所以即使没有putenv 调用它也可以改变。
      • 该语言已在第 7 期中删除,但它仍然声称该函数不是线程安全的。我想唯一严格认可的线程安全访问环境的方法是通过extern char **environ;...
      • @R,谢谢,我没有意识到这不是最新版本。但它只是从返回值部分中删除。描述仍然显示,“指向的字符串可能会被后续调用 getenv() [...] 覆盖”。我不认为修改environ 是解决方案,因为它说,“要求符合要求的应用程序不要直接修改环境。”我不知道为什么仍然没有getenv_r 电话。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2011-03-29
          • 2015-05-20
          • 2017-01-09
          • 1970-01-01
          • 2010-09-14
          • 1970-01-01
          • 2022-07-26
          • 2011-03-21
          • 2017-04-01
          相关资源
          最近更新 更多