c++ main返回后调用std::getenv()安全吗?

mwg9r5ms  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(231)

标准是否保证std::getenv()std::setenv()具有与cout相同的访问保护?标准允许在main返回后在静态对象的析构函数(和构造函数)中访问
静态对象的构造函数和析构函数可以访问这些对象,从stdin读取输入或将输出写入stdoutstderr
从阅读似乎会从std::setenv()调用的代码来看,它似乎是在一个全局变量上操作的(根据https://github.com/digitalocean/gnulib/blob/master/lib/setenv.c#L113)。所以好奇的是,是否需要使用与coutcincerr相同的技巧来使它们在关机时可访问。

smdncfj3

smdncfj31#

cout及其同类在C++中是命名空间范围内的对象。因此,当main退出时,它们将被销毁。它们将按照相对于其他全局对象的销毁顺序被销毁,而这些全局对象是您完全无法控制的。
因此,为了确保您可以在静态对象构造函数/析构函数调用期间与这些对象交互,标准要求实现确保这些对象保持有效和未销毁。这条语句是 * 必需的 *,否则在静态对象构造函数/析构函数调用期间不可能安全地访问这些对象。
相反,getenv是一个 * 函数 *,而不是一个对象。它不能被摧毁。函数的行为完全且仅由其行为的标准定义确定,并且该行为必须“总是”发生。因此,除非这些函数被标准声明为在静态对象构造/析构的范围内调用时具有不同的行为,否则它们将继续在这些情况下做它们所说的事情。

相关问题