事實上,通過利用單身的你可以非常有效地在空調控制全局/靜態對象的初始化順序++。
例如,假設您有:
class Abc
{
public:
void foo();
};
,並在全球範圍內定義的相應的對象:
Abc abc;
然後你有一個類:
class Def
{
public:
Def()
{
abc.foo();
}
};
其中也有在全球範圍內定義的對象:
Def def;
在這種情況下,您無法控制初始化順序,並且如果首先初始化def,那麼很可能您的程序將崩潰,因爲它正在調用abc上的foo()方法,該方法尚未初始化。
的解決方案是在全局範圍內的功能做這樣的事情:
Abc& abc()
{
static Abc a;
return a;
}
,然後防守看起來是這樣的:
class Def
{
public:
Def()
{
abc().foo();
}
};
這樣,農行始終保證是在使用它之前初始化,因爲這將在首次調用abc()函數期間發生。同樣,你應該對Def全局對象做同樣的事情,以使它不會有任何意外的初始化依賴。
Def& def()
{
static Def d;
return d;
}
如果您需要嚴格控制,除了簡單地確保一切初始化的順序初始化在使用之前,把所有的全局對象在全局單如下。
struct Global
{
Abc abc;
Def def;
};
Global& global()
{
static Global g;
return g;
}
做出這些項目的引用如下:
//..some code
global().abc.foo();
//..more code here
global().def.bar();
無論哪一個首先得到調用,C++成員初始化規則將保證ABC和DEF對象在他們的順序初始化在Global類中定義。
你有沒有嘗試用「-g3」標誌重新編譯?這應該爲你提供大量的調試符號。 – 2009-08-03 20:35:05
它是確定所有編譯單元的最終排序的鏈接器。我相信g ++有一些可能有助於定義順序的編譯指示。 – 2009-08-03 21:03:47
答案具有很高的平臺特定性,並且您已經設法保護您的平臺。請透露它,以及您使用的GDB版本。 – 2009-08-04 04:40:02