non-local static object初始化顺序的不确定性

在IBM中国开发博客上看到这么一个博文https://www.ibm.com/developerworks/community/blogs/12bb75c9-dfec-42f5-8b55-b669cc56ad76/entry/_e8_b7_a8c__e6_96_87_e4_bb_b6_e5_92_8c_e5_ba_93_e5_af_b9_e9_9d_99_e6_80_81_e5_af_b9_e8_b1_a1_e8_bf_9b_e8_a1_8c_e5_88_9d_e5_a7_8b_e5_8c_965?lang=zh

有关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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值