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

zdwk9cvp  于 6个月前  发布在  其他
关注(0)|答案(5)|浏览(71)
char * val;
val = getenv("ENV_VAR_NAME");

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

mefy6pfw

mefy6pfw1#

不,你不应该.标准7.20.4.5说:
getenv函数返回一个指针,指向与匹配的列表成员相关联的字符串。程序不能修改所指向的字符串,但可以通过随后调用getenv函数覆盖。
我认为黑体字的案文包括删除。

lb3vh1jj

lb3vh1jj2#

您不应该释放它。这是手册页中的一个片段:
getenv()返回一个指向环境列表中的字符串的指针。调用者必须注意不要修改这个字符串,因为这会改变进程的环境。
别碰它!

4nkexdtk

4nkexdtk3#

不能。你不能控制它的存储。通常,它是一个指向静态数组的指针,可以多次重用。因此,如果你打算存储它以供以后使用,你应该复制它(你应该确保这个副本被正确释放)。
除非文档中明确指出可以释放指针,否则不应该这样做。

y4ekin9u

y4ekin9u4#

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

hi3rlvi2

hi3rlvi25#

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

相关问题