2012-06-16 36 views
1

是否有辦法抑制全局對象(特別是那些集合類型的析構函數,如vectorunordered_map)的析構函數的生成,或者退出程序而不調用此類析構函數(但仍然會沖洗標準輸出,因爲我收集abort不這樣做)?跳過C++全局析構函數

回答

2

做到這一點的最簡單的方法是在堆上創建它們,並且不會釋放:

std::vector<int> *doNotCallDestructor = new std::vector<int>; 
//... 
2

這是哪門子的問題,可以用穩健初始化按需來解決。

std::vector<int> & get_my_vector() { 
    static std::vector<int> *vec; 
    if (vec) return *vec; 
    return *(vec = new std::vector<int>); 
} 

在多線程的情況下,你可以使用「雙重檢查鎖定」初始化靜態的,或者如果你有C++ 11,以下是保證線程安全:

std::vector<int> & get_my_vector() { 
    static std::vector<int> *vec = new std::vector<int>; 
    return *vec; 
} 

初始化需求提供了以下好處:全局的

  • 延遲初始化 - 這意味着如果全球不使用,無記憶將它分配。傳統的全局資源在起步時佔用資源。
  • 對共享庫初始化依賴關係的免疫性 - 這意味着如果一個共享庫想要使用另一個共享庫的全局屬性,那麼Singleton模式會觸發代碼對該全局按需進行初始化。從不同的共享庫訪問時,傳統的全局變量可能尚未初始化。

按需初始化與用於在Singleton模式中實例化單例的技術相同。由於我們不限制vector<int>的實例數,所以這個習語在任何意義上都不是單例。

+0

事實上,初始化順序的失敗可能會像您一樣將全局變成兩個不同的翻譯單元(源文件),根本不需要涉及庫。 –

+0

這不是一個單身人士,它只是一個本地靜態(這是更好的,它不會阻止其他人創建一個矢量如果他們想要) –

+0

我不確定「健壯」是正確的詞,因爲這不是' T線程安全。 'static std :: vector * vec = new std :: vector ; return * vec;'只要你的編譯器保證本地靜態的線程安全初始化(C++ 11編譯器必須),'會更好。 –