是否有辦法抑制全局對象(特別是那些集合類型的析構函數,如vector
和unordered_map
)的析構函數的生成,或者退出程序而不調用此類析構函數(但仍然會沖洗標準輸出,因爲我收集abort
不這樣做)?跳過C++全局析構函數
1
A
回答
4
我相信你在尋找quick_exit和_Exit。
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>
的實例數,所以這個習語在任何意義上都不是單例。
相關問題
- 1. 的gcov和全局析構函數
- 2. 構造函數和析構函數 - C++
- 3. C++類構造函數/析構函數
- 4. C++跳過一個函數?
- 5. 正在跳過C++函數
- 6. C++全局函數和OOP?
- 7. 全局變量析構函數未調用,從哪裏開始?
- 8. Android - 本機全局對象析構函數從未調用
- 9. C++析構函數在拋出特定異常時跳過工作的方式?
- 10. 什麼時候在NDK中調用全局變量的C++析構函數?
- 11. 從C中的析構函數訪問值類型全局變量#
- 12. C++虛擬析構函數
- 13. C++析構函數示例
- 14. 析構函數LinkedListelement在C++
- 15. C++析構函數代碼
- 16. C中的析構函數#
- 17. C++:CRTP析構函數?
- 18. C++新手:析構函數
- 19. C++,與析構函數
- 20. C++中的析構函數
- 21. 析構函數在C++
- 22. C++需要析構函數
- 23. C++的析構函數
- 24. 類析構函數C++
- 25. C++中的析構函數
- 26. lua userdata C++析構函數
- 27. C++虛擬析構函數
- 28. C++析構函數異常
- 29. C++ thread_local析構函數與pthread析構函數
- 30. 沒有析構函數的C++函數
事實上,初始化順序的失敗可能會像您一樣將全局變成兩個不同的翻譯單元(源文件),根本不需要涉及庫。 –
這不是一個單身人士,它只是一個本地靜態(這是更好的,它不會阻止其他人創建一個矢量如果他們想要) –
我不確定「健壯」是正確的詞,因爲這不是' T線程安全。 'static std :: vector * vec = new std :: vector ; return * vec;'只要你的編譯器保證本地靜態的線程安全初始化(C++ 11編譯器必須),'會更好。 –