[解決済み] C++の関数内のスタティック変数のライフタイムは?
2022-03-22 04:41:05
質問
という変数が宣言されている場合
static
は一度だけ初期化され、関数が呼び出されるたびにその値を保持します。その寿命とはいったい何でしょうか?また、コンストラクタやデストラクタはいつ呼び出されるのでしょうか?
void foo()
{
static string plonk = "When will I die?";
}
解決方法は?
関数の寿命
static
変数が開始されるのは
[0]
は、プログラムの流れがその宣言に遭遇し、プログラムの終了時に終了します。つまり、ランタイムは、実際に構築された場合のみ、それを破棄するために、何らかのブックキーピングを行わなければならない。
さらに、静的オブジェクトのデストラクタは、その構築の完了と逆の順序で実行されなければならないと規格で定められているので [1] であり、具体的なプログラムの実行順序に依存する可能性があるため、構築順序を考慮する必要があります。
例
struct emitter {
string str;
emitter(const string& s) : str(s) { cout << "Created " << str << endl; }
~emitter() { cout << "Destroyed " << str << endl; }
};
void foo(bool skip_first)
{
if (!skip_first)
static emitter a("in if");
static emitter b("in foo");
}
int main(int argc, char*[])
{
foo(argc != 2);
if (argc == 3)
foo(false);
}
出力します。
C:>sample.exe
fooで作成された
fooで破壊されたC:>sample.exe 1
で作成されます。
fooで作成
fooで破壊された
if で破壊されるC:>sample.exe 1 2
fooで作成された
if で作成された
ifで破棄される
foo で破壊される
[0]
以来
C++98
[2]
はマルチスレッドへの言及がなく、マルチスレッド環境でどのように動作するかは未定であり、以下のような問題があります。
ロディ
が言及しています。
[1]
C++98
セクション
3.6.3.1
[基本.開始.項]。
[2]
C++11では、静的要素はスレッドセーフな方法で初期化され、これは次のように知られています。
マジックスタティック
.
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み] 配列のベクトルを扱う正しい方法