我遇到了同樣的問題。據我所知,這似乎是這樣的:
即使一個類在初始化過程中的任何一點嘗試動態分配,每個類類型的靜態變量和全局變量都將默默無法初始化。大概這是因爲用於動態內存的ByteBuffer尚不可用。我希望鍊金術會更加清楚它的錯誤信息,因爲目前它就像是一串舊時的聖誕燈,其中一個死燈泡會導致整個燈串關閉。
對於解決方法,一旦發現有問題的對象,您需要以某種方式將其初始化推遲到運行時。想到的三種技術是指針,懶惰的評估函數或對使用新位置初始化的緩衝區的引用。
指針
// `global` is now a pointer
TestClass *global;
// all global variable initialization is found here now
void init_globals() {
global = new TestClass("global");
}
int main(int argc, char **argv) {
// this needs to be explicitly called at the start Alchemy
init_globals();
然後,您需要重構你的代碼中,global
每一次出現轉變爲(*global)
。
功能
// `global` is now a function
TestClass& global() {
// static locals are initialized when their functions are first called
static TestClass global_("global");
return global_;
}
現在你需要global()
更換的global
每一次出現。值得注意的是,這是這三種技術中唯一不需要明確調用init_globals
的技術。我建議這樣,除非名稱更改爲global()
麻煩出於某種原因......在這種情況下:
安置新
// a memory buffer is created large enough to hold a TestClass object
unsigned char global_mem[sizeof(TestClass)];
// `global` is now a reference.
TestClass& global = *(TestClass*)(void*)global_mem;
void init_globals() {
// this initializes a new TestClass object inside our memory buffer
new (global_mem) TestClass("global");
}
int main(int argc, char **argv) {
init_globals();
這種方法的優點是你不需要改變任何其他代碼,因爲global
仍然只叫global
。不幸的是,保持一個init_globals
函數可能會很麻煩。
編輯:
作爲以後的問題發現,除了動態分配,包含靜態當地人也功能無法鍊金術的初始化過程中調用。
對於「這就像一串舊時聖誕燈」,因爲這正是它的原因。 :) – paleozogt 2010-11-17 18:24:54