英文:
Is std::getenv() safe to call after main returns?
问题
以下是翻译好的部分:
标准是否保证std::getenv()
和std::setenv()
具有与cout
相同的访问保护?标准允许在main
函数返回后,在静态对象的析构函数(和构造函数)中访问它们。
静态对象的构造函数和析构函数可以访问这些对象,从
stdin
读取输入或向stdout
或stderr
写入输出。
从阅读代码来看,似乎std::setenv()
被调用时会操作全局变量(参考https://github.com/digitalocean/gnulib/blob/master/lib/setenv.c#L113)。因此,我想知道是否需要使用与cout
、cin
和cerr
相同的技巧,以使它们在程序关闭时仍然可以访问。
英文:
Does the standard guarantee that std::getenv()
and std::setenv()
have the same access protections as cout
? For which the standard allows access after main returns, in the destructor (and constructor) of static objects
> Constructors and destructors for static objects can access these objects to read input from stdin
or write output to stdout
or stderr
.
From reading code that seems like it would be called from std::setenv()
, it seems like it operates on a global variable (as per https://github.com/digitalocean/gnulib/blob/master/lib/setenv.c#L113). So curious if it's required to use the same tricks as cout
, cin
, and cerr
to make them accessible on shutdown.
答案1
得分: 4
cout
及其类似物是C++中的命名空间作用域对象。因此,当main
退出时,它们将被销毁。它们将按照相对于其他全局对象的销毁顺序被销毁,而您对这些对象绝对没有控制权。
因此,为了确保您可以在静态对象构造/析构函数调用期间与这些对象交互,标准要求实现确保这些对象保持有效且未被销毁。这个陈述是必要的,否则在静态对象构造/析构函数调用期间安全访问这些对象将是不可能的。
相比之下,getenv
是一个函数,而不是一个对象。它不能被销毁。函数的行为完全由标准对其行为的定义确定,而且该行为必须始终发生。因此,除非标准规定在静态对象构造/析构函数范围内调用这些函数时具有不同的行为,否则它们将继续在这些情况下执行它们所声明的操作。
英文:
cout
and its ilk are namespace-scoped objects in C++. As such, when main
exits, they will be destroyed. And they will be destroyed in an order relative to the destruction of other global objects over which you have absolutely no control.
Therefore, to ensure that you can interact with these objects during static object constructor/destructor calls, the standard requires that the implementation ensure that these objects remain valid and undestroyed. This statement is necessary, as otherwise it would be impossible to access those objects safely during static object constructor/destructor calls.
By contrast, getenv
is a function, not an object. It cannot be destroyed. The behavior of a function is determined entirely and only by the standard's definition of its behavior, and that behavior must always happen. Therefore, unless those functions are stated by the standard to have different behavior when called within the scope of static object construction/destruction, they will continue to do what they say they do in those circumstances.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论