статическое объявление за динамически объявленными массивами

Я хочу, чтобы в функции был массив, который сохраняет свое значение при выходе из функции, например,

 int func(int x)
{
static int arr[5];
}

Но проблема в том, что я заранее не знаю размер массива (то есть он зависит от x). Итак, я должен объявить массив, используя «новый».

Можно ли это сделать так?

 static int *arr=new int[x];

или я должен буду сделать:

  static int *static arr = new int[x]

Если нет то
как это сделать?

1

Решение

static int *arr = new int[x]; все в порядке. Тем не менее, вам нужно беспокоиться об утечке памяти, так как нет хорошего повода для delete [] arr;,

Как описано в комментариях, местный static std::vector<int> arr; является предпочтительным, так как его деструктор вызывается автоматически в конце программы.

2

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

Я не думаю, что это законно.
Причина, по которой вы можете использовать переменные для «динамического» размера массива в области действия функции, заключается в AFAIK, потому что массив помещается в стек:

void foo(int x)
{
int bar[x]; // this is legal
} // but goes out-of-scope here :-(

Объявление массива static разрушает это. Подумайте об этом так: у компоновщика нет шансов узнать размер массива, следовательно, он не может найти что-либо «за пределами» массива (явно нежелательно).

Так что в основном вам нужно использовать кучу через new а также delete, Или еще лучше использовать std::vector<> как уже предлагалось (использует кучу внутри).

0

По вопросам рекламы [email protected]