3 回答
TA贡献1772条经验 获得超8个赞
静态对象以相反的顺序破坏。而且施工顺序很难控制。您唯一可以确定的是,将按定义顺序构造在同一编译单元中定义的两个对象。其他任何事物或多或少都是随机的。
TA贡献2016条经验 获得超9个赞
对此的其他答案坚持认为它无法完成。他们是对的,依据规范-但有是一招,可以让你做到这一点。
仅创建一个单一的静态变量,它包含了所有其他的事情,你通常会做静态变量,像这样一类或结构的,:
class StaticVariables {
public:
StaticVariables(): pvar1(new Var1Type), pvar2(new Var2Type) { };
~StaticVariables();
Var1Type *pvar1;
Var2Type *pvar2;
};
static StaticVariables svars;
您可以按所需的顺序创建变量,更重要的是,可以按所需的顺序破坏变量,方法是在的构造函数和析构函数中StaticVariables。为了使其完全透明,您也可以创建对变量的静态引用,如下所示:
static Var1Type &var1(*svars.var1);
Voilà-完全控制。:-)也就是说,这是额外的工作,通常是不必要的。但是,当有必要时,了解它非常有用。
TA贡献1801条经验 获得超8个赞
静态对象的破坏顺序与生成它们的顺序相反(例如,第一个破坏的对象最后被破坏),您可以使用第47条中所述的技术来控制静态对象的生成顺序,在Meyers的书《Effective C ++》中“ 确保在使用全局对象之前对其进行了初始化 ” 。
例如,以某种方式指定我希望某个对象最后被破坏,或者至少在另一个静态注入之后被破坏?
确保在其他静态对象之前构造它。
如何控制施工顺序?并非所有的静态函数都在同一个dll中。
为了简单起见,我将忽略它们不在同一个DLL中的事实。
我对迈耶斯项目47(长4页)的解释如下。假设您在这样的头文件中定义了全局变量...
//GlobalA.h
extern GlobalA globalA; //declare a global
...向这样的包含文件添加一些代码...
//GlobalA.h
extern GlobalA globalA; //declare a global
class InitA
{
static int refCount;
public:
InitA();
~InitA();
};
static InitA initA;
这样做的结果是,任何包含GlobalA.h的文件(例如,定义了第二个全局变量的GlobalB.cpp源文件)都将定义InitA类的静态实例,该实例将在该实例中的其他任何对象之前进行构造源文件(例如,在第二个全局变量之前)。
该InitA类具有静态引用计数器。当构造第一个InitA实例时(现在可以保证在构造GlobalB实例之前),InitA构造函数可以执行其必须做的一切以确保初始化globalA实例。
- 3 回答
- 0 关注
- 730 浏览
添加回答
举报