[英]C++ static member variable scope
標題基本上都說明了這一點,我想知道什么時候初始化c ++類的靜態成員以及它們何時超出范圍。
我需要這個以解決以下問題。 我有很多Foo類的對象,每個對象都需要訪問一個資源,由另一個類Bar封裝。 同步不是問題,所以我希望所有對象共享相同的Bar實例。
我正在使用一個簡單的托管指針進行引用計數。
我可以做以下事情:
class Foo {
private:
static managed_pointer<Bar> staticBar;
public:
Foo() {
if(!staticBar)
staticBar = new Bar;
}
/*
* use staticBar in various non-static member functions
*/
};
managed_pointer<Bar> Foo::staticBar = NULL;
managed_pointer staticBar應該在它超出范圍時立即刪除它 - 但是什么時候會發生? 當Foo的最后一個實例被破壞時? 在申請退出?
謝謝你的建議!
static
s和globals在程序啟動之前初始化(在調用main
之前,程序實際上在此之前啟動)並在main
退出之后超出范圍。
異常 - 本地靜態(函數內部聲明的靜態變量)和未使用的模板類static
成員。
它與實例數無關。
該標准沒有指定初始化的精確順序,它是特定於實現的。 它們將在程序開始時實例化,並在最后解除分配。
你必須非常小心你正在做的事情,因為如果你有一些其他依賴這個對象存在的靜態對象,它就是UB。 沒有人知道他們將以什么順序進行初始化。
您可以查看boost :: call_once之類的內容以確保它初始化一次,但我不會依賴於初始化靜態的順序。
據我所知,你的代碼可以工作,但我之前被靜態初始化問題所困擾所以我想警告你。
編輯:同樣在您的代碼中,當managed_ptr超出范圍(程序結束)時,它將刪除自動分配的內存。 但是你不應該在Bar的析構函數中做任何不重要的事情,因為你可以通過調用其他free'd實例甚至是已經被刪除的代碼來觸發UB(因為它發生在我曾經刪除動態庫的地方)。 基本上你是在一個雷區,所以要小心。
從您的問題中突然出現的第一件事是常見的誤解,即范圍和生命周期是等同的概念。 他們不是。 在某些情況下,與局部變量一樣, 生命周期與特定上下文綁定,但情況並非總是如此。
類靜態成員變量具有類作用域 (可在程序中的任何位置訪問)和靜態生存期 ,這意味着它將按照相同轉換單元中的其他靜態變量的順序進行初始化,並且以未定義的順序進行初始化在 main 之前的其他翻譯單元中的其他靜態變量(警告:初始化不需要在main中的第一個語句之前執行,但保證在變量的第一次使用之前)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.