为什么类类型的静态变量和全局变量是危险的

Why static and global variables of class type are dangerous?

本文关键字:全局变量 危险 静态 类型 为什么 变量      更新时间:2023-10-16

http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Static_and_Global_Variables

禁止类类型的静态或全局变量:它们会导致 由于构造顺序不确定而难以发现的错误,以及 破坏。

如果类类型的全局变量不依赖于其他全局变量,例如std::string strvar("abc"),使用它有什么问题/不安全?

该指南还说:

。除了禁止类类型的全局变量外,我们不禁止 允许使用结果初始化静态 POD 变量 函数,除非该函数(如 getenv() 或 getpid()) 本身不依赖于任何其他全局变量。

我认为strvar很好,原因是一样的:它的构造函数本身不依赖于任何其他全局变量。

我也想知道C++11对POD的宽松定义在这方面是否有任何反映?

谷歌显然试图保持规则简单。因此,虽然在某些情况下可能非常安全,但描述这些异常会很困难。允许这些异常的好处可能不足以保证这种额外的复杂性。

类的全局和静态实例的问题在于,它们的构造/销毁顺序取决于实现。这意味着,如果你的代码依赖于它们在特定时间的存在,你很可能会得到一个不受欢迎的惊喜。

许多类的实现,尤其是 Google 标准库中的类,依赖于在程序开始时初始化的全局状态。类构造函数可以打开网络连接或获取单例,其方式显然不会引用其他全局变量。

通常,构造函数应该可以自由地假设它们声明的全局变量已被初始化,如果碰巧在链接器初始化的对象上静态调用它们,则会中断。