为什么类类型的静态变量和全局变量是危险的
Why static and global variables of class type are dangerous?
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 标准库中的类,依赖于在程序开始时初始化的全局状态。类构造函数可以打开网络连接或获取单例,其方式显然不会引用其他全局变量。
通常,构造函数应该可以自由地假设它们声明的全局变量已被初始化,如果碰巧在链接器初始化的对象上静态调用它们,则会中断。
相关文章:
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局变量 多读取器 一个写入器多线程安全?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- C++ 在编译时具有函数计算全局变量
- 修改程序的入口点时未调用全局变量的构造函数
- 使用 std::ios_base::Init 正确初始化全局变量
- 为什么我的全局变量似乎没有变化?
- C ++程序如何返回我的数组或写入全局变量
- 为什么我的数组值与此处的全局变量不匹配?
- QT C++中对全局变量的未定义引用
- 跨多个类的全局变量而不会出现重定义错误?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- 为什么类类型的静态变量和全局变量是危险的
- 可能同时从不同的线程读取全局变量是否危险
- 全局变量-C++为什么这种方式很危险