您的位置:首页 > 其它

Mac dmg文件灰色无法安装

2014-07-06 19:34 253 查看
所谓static对象,其寿命从被构造出来直到程序结束为止,因此
stack和heap-based对象都被排除。这种对象包括global对象,定
义于namespace作用域内的对象、在class内、在函数内、以及在
file作用域内被声明为static的对象。函数内的static对象称为
local static对象(因为它们对函数而言是local),其他static
对象称为non-local static对象。程序结束时static对象会被自动
销毁,也就是它们的析构函数会在main()结束时被自动调用。
所谓编译单元(translation unit)是指产出单一目标文件
(single object file)的那些源码。基本上它是单一源码文件加
上其所含入的头文件。
C++对“定义于不同编译单元内的non-local static对象”的初始
化次序并无明确定义。
问题来了:如果某编译单元内的某个non-local static对象的初始
化动作使用了另一个编译单元内的某个non-local static对象,它
所用到的这个对象可能尚未被初始化。
解决方法:
将每个non-local static对象搬到自己的专属函数内(该对象在此
函数内被声明为static)。这些函数返回一个reference指向它所
含的对象。然后用户调用这些函数,而不直接指涉这些对象。这个
专属函数我们叫它reference-returning函数。其形式大致为:
class classNameA
{
...
};
class classNameB
{
...
inline classNameA& clsNameAObj()
{
static classNameA clsNameA;
return clsNameA;
}
...
}
这个方法的基础在于:C++保证,函数内的local static对象会在
“该函数被调用期间”“首次遇上该对象之定义式”时被初始化。
但从另一个角度看,这些函数“内含static对象”的事实使他们在
多线程系统中带有不确定性。我们可以在程序的单线程启动阶段手
工调用所有reference-returning函数,这可消除与初始化有关的
“竞速形式(race conditions)”。
我们总是需要为内置型对象进行手工初始化,因为C++不保证初始化他们。

本文出自 “宁静致远” 博客,请务必保留此出处http://coolbreezex.blog.51cto.com/2884642/1334071
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐