статическая переменная, динамически размещаемая

Статическая переменная внутри функции выделяется только один раз за время существования программы.

Так что, если у меня есть такая функция:

void f(int n) {

static int *a = new int[n];

}

и я первый звонок

f(1)

а потом

f(3)

насколько большим будет массив после второго вызова?

9

Решение

static локальные переменные будут инициализированы, когда поток управления впервые достигнет декларации. В этом случае, так как вы впервые использовали 1 как n параметр, вы будете выделять размер для одного int,

Делать такие вещи — плохая идея. Вы должны просто использовать локальный, нестатичный, std::vector или какой-то другой контейнер более высокого уровня.

6

Другие решения

static переменные локальные функции инициализируются при первом прохождении через них управления. Соответствующий раздел в стандарте — 6.7 [stmt.dcl]. То есть массив получит размер 1 и сохранит его, если вы явно не измените его размер.

В C ++ 2011 хорошо то, что инициализация static переменная также является поточно-ориентированной: если другой поток достигает экземпляра во время инициализации переменной, второй поток блокируется до завершения инициализации.

6

Инициализация статических переменных внутри функции происходит только во время первой оценки статического оператора внутри функции. Первый раз когда f вызывается с f(1)инициализация для a будет происходить, и это будет указывать на массив из одного int. когда f(3) называется, a уже инициализирован, поэтому правая часть:

static int *a = new int[n];

не будет оцениваться снова, и a будет продолжать указывать на первоначально выделенный массив размером 1.

2

Массив будет иметь размер 1, поскольку инициализация переменной «a» выполняется только один раз, при первом вызове функции «f».

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector