条款47:使用non-local static objects之前先确定它已有初值
1,当一个编译单元内某对象的初始化动作,与另一个编译单元内某对象的值相依,而后者也需要初始化。可能导致第一个对象没有初值。
2,解决的办法:Singleton pattern。
将每一个non-local static object转到一个专属函数中,接下来令函数传回一个reference,指向内含的那个static object。
这样,客户不再直接取用static object,而是改调用函数。
依据:C++明确指出函数中的static对象的初始化时机:在函数调用期间第一次遇到对象的定义时。
这样做的另一个好处:如果从未调用带有非本地静态对象的函数,那么绝不会付出对象的构造和析构成本。
例:
FileSystem& theFileSystem()
{
static FileSystem tfs;
return tfs;
}
客户端几乎完全不变,只不过它们现在调用theFileSystem(),而不是直接取用theFileSystem。
页:
[1]