0

不应存储 getenv 返回的指针,因为将来对 getenv 的调用可能会更改它(或对 setenv 的调用等)。我正在尝试围绕 getenv 编写一个方便的包装器,如果找不到环境变量,它会返回一个默认值。我宁愿不泄漏内存。

我想到的选项:
让包装函数复制 getenv 返回的字符串,使用 malloc 和 strcpy 或 strdup (这是在符合 POSIX 的系统上)。这有效并允许错误处理,但需要调用者记住释放指针。这为内存泄漏创造了空间。
不要费心尝试缓存该值,而是让每个调用者都这样做。这使得离开竞争条件变得容易。使用全局变量来存储 getenv 返回的字符串的副本。这将避免调用者释放内存的需要,但除非我添加某种锁定/原子更新,否则会像单独的 getenv 那样冒竞争条件的风险。
在函数中使用静态变量来缓存值。这可能是最好的选择,因为它会为后续调用重用内存,但可能会导致竞争条件。

我有理由确定我错过了一些东西。

4

1 回答 1

2

这不是真的:

不应存储 getenv 返回的指针,因为将来对 getenv 的调用可能会更改它

以下是:

(或调用 setenv 等...

但是,这里的结论只是您不能setenv在多线程进程中使用(或任何修改环境的东西)。这样做还会使任何使用该环境的标准函数成为线程不安全的。

因此,继续使用getenv并将其返回值指向的字符串视为不可变的。

于 2018-11-26T22:18:01.467 回答