Статическая переменная внутри функции выделяется только один раз за время существования программы.
Так что, если у меня есть такая функция:
void f(int n) {
static int *a = new int[n];
}
и я первый звонок
f(1)
а потом
f(3)
насколько большим будет массив после второго вызова?
static
локальные переменные будут инициализированы, когда поток управления впервые достигнет декларации. В этом случае, так как вы впервые использовали 1
как n
параметр, вы будете выделять размер для одного int
,
Делать такие вещи — плохая идея. Вы должны просто использовать локальный, нестатичный, std::vector
или какой-то другой контейнер более высокого уровня.
static
переменные локальные функции инициализируются при первом прохождении через них управления. Соответствующий раздел в стандарте — 6.7 [stmt.dcl]. То есть массив получит размер 1 и сохранит его, если вы явно не измените его размер.
В C ++ 2011 хорошо то, что инициализация static
переменная также является поточно-ориентированной: если другой поток достигает экземпляра во время инициализации переменной, второй поток блокируется до завершения инициализации.
Инициализация статических переменных внутри функции происходит только во время первой оценки статического оператора внутри функции. Первый раз когда f
вызывается с f(1)
инициализация для a
будет происходить, и это будет указывать на массив из одного int. когда f(3)
называется, a
уже инициализирован, поэтому правая часть:
static int *a = new int[n];
не будет оцениваться снова, и a
будет продолжать указывать на первоначально выделенный массив размером 1.
Массив будет иметь размер 1, поскольку инициализация переменной «a» выполняется только один раз, при первом вызове функции «f».