關於在C++中銷燬靜態變量的順序,是否有任何有關靜態對象相對於其靜態成員變量的生命週期的保證?在C++中,靜態對象是否可以超出其靜態成員變量?
舉例來說,如果我有這樣的事情(瘋狂簡化的例子僅用於演示目的):
class Object {
static std::vector< Object * > all_objects;
public
Object() {
all_objects.push_back(this);
}
~Object() {
all_objects.erase(
std::remove(all_objects.begin(), all_objects.end(), this),
all_objects.end());
}
};
這將是「安全的」關於在不同的編譯單元的靜態對象?也就是說,是否有任何保證all_objects
成員變量將至少與任何有效對象一樣長,或者在最後一個對象實例之前可能會銷燬all_objects
?
並會在被用作庫中的代碼的答案變化(Python中說),而不是與自己的主要一個獨立的程序()?
函數級靜態變量與全局(或類)級靜態變量的破壞順序規則是什麼?我們確定'all_objects'會堅持到所有的靜態對象消失嗎? –
@ R.M。,請參閱最新的答案。 –
「構造函數的完成」是否改變了一些東西?例如http://stackoverflow.com/a/335746/3022952表明,當您在Object的構造函數中調用get_all_objects()函數時,all_objects變量將在完成第一個Object的構造函數之前完成其構造函數,這意味着all_objects的析構函數只會在所有*對象的析構函數完成後調用。或者我解釋錯了什麼? –