3

假设我们有一些使用 extern 关键字的外部链接。

我有(在class1.cpp中):

MyClass* myClassVar = NULL;

构造函数初始化以上内容,析构函数删除。

然后在 class2.cpp 和 class3.cpp 中有:

extern MyClass* myClassVar;

这些类使用 myClassVar(进行通常的空值检查等)。

单身人士会更受欢迎吗?(我知道全局变量不好等等,单例只是语法糖)。将上面的代码更改为下面的代码是否有好处?

static Singleton& getInstance()
{
   static Singleton instance;

   return instance;
}

然后所有课程都会做:

Singleton::getInstance()
4

2 回答 2

7

全局变量遭受初始化顺序惨败。单独翻译单元中的全局变量以未指定的顺序初始化,因此如果一个在其构造函数中引用另一个,您将获得未定义的行为。

函数范围内的静态变量在第一次调用函数时被初始化,这(或多或少)解决了初始化顺序问题。

然而,更微妙的问题仍然存在;特别是,在对象被销毁后仍然可以访问它,并且有一些开销来确保线程安全初始化(并且,在旧编译器中,初始化可能根本不是线程安全的)。管理非平凡类型的全局可访问对象没有完全安全的方法,我的建议是尽可能避免使用它们。

于 2012-09-03T12:35:27.103 回答
4

既然您说您已经知道任何类型的全局变量的缺点,唯一的优点是您将类的实例限制为 1,而不是 using extern,您可以在其中定义多个此类变量。

于 2012-09-03T12:31:37.413 回答