有关non-local static object initialization order 跨多个文件或者库时,编译器不能保证他们的初始化顺序,所以会出现用来初始化别人的对象却没有初始化的现象,导致别的对象被初始化为内存中的垃圾数据
在<<effective c++>>中的条款四"在对象使用前已经被正确初始化"中提到这个问题。给出的解决办法是,将non-local static object变为函数中的local static object,并且函数返回这个object的引用,给别的object初始化的时候用这个函数来执行。之所以能这么做,是因为local-static-object只有在第一次遇到该定义式时才会执行初始化,以后都不会执行。通过函数保证了用来初始化别的对象的object已经完成了初始化。这样也就不会出现上述博文中提到的情况。
当然博文中同时提到可以通过编译器给各个module指定一个priority,来显示指定各个module的初始化顺序(当然不是编译的顺序),但对于大型项目来说,毕竟不是可采用的方法,文章有点宣传xlc编译器的嫌疑了。。。
2013/5/10