関数内の静的変数は、プログラムの存続期間中に一度だけ割り当てられます。
したがって、次のような関数がある場合:
void f(int n) {
static int *a = new int[n];
}
そして私は最初に電話します
f(1)
その後
f(3)
2回目の呼び出し後、配列はどのくらいの大きさになりますか?
static
関数のローカル変数は、最初に制御が渡されるときに初期化されます。標準の関連セクションは 6.7 [stmt.dcl] です。つまり、配列はサイズ 1 を取得し、サイズを明示的に変更しない限り、このサイズを維持します。
C++ 2011 の優れている点は、static
変数の初期化もスレッド セーフであることです。変数の初期化中に別のスレッドがインスタンスに到達すると、2 番目のスレッドは初期化が完了するまでブロックされます。
static
ローカル変数は、制御フローが最初に宣言に到達したときに初期化されます。この場合、パラメータとして初めて使用1
したときから、1n
つの にサイズを割り当てますint
。
このようなことをするのは悪い考えです。ローカル、非静的、std::vector
またはその他の高レベルのコンテナーを使用する必要があります。
変数 'a' の初期化は関数 'f' が最初に呼び出されたときに 1 回だけ行われるため、配列のサイズは 1 になります。