假设我们使用extern关键字进行了一些外部链接。
我(在class1.cpp中):
MyClass* myClassVar = NULL;
构造函数初始化上面的内容,析构函数删除。
然后在class2.cpp和class3.cpp中有:
extern MyClass* myClassVar;
这些类使用myClassVar(执行常见的空检查等)。
单身人士会被选择吗? (我知道全局变量等等,而Singleton只是语法糖)。将上述代码更改为以下代码是否有优势?
static Singleton& getInstance()
{
static Singleton instance;
return instance;
}
然后所有课程都会这样做:
Singleton::getInstance()
答案 0 :(得分:7)
全局变量受初始化顺序惨败的影响。单独翻译单元中的全局变量以未指定的顺序初始化,因此如果在构造函数中引用另一个,则会得到未定义的行为。
函数作用域中的静态变量在第一次调用函数时初始化,这会(或多或少)解决初始化顺序问题。
但是,仍存在更微妙的问题;特别是,仍然可以在对象被销毁后访问它,并且有一些开销来确保线程安全的初始化(并且在较旧的编译器中,初始化可能根本不是线程安全的)。没有完全安全的方法来管理非平凡类型的全局可访问对象,我的建议是尽可能完全避免它们。
答案 1 :(得分:4)
因为你说你已经知道任何类型的全局变量的垮台,唯一的好处是你将类的实例限制为1,而不是使用extern
,你可以在那里定义多个这种变量。