Я хочу, чтобы в функции был массив, который сохраняет свое значение при выходе из функции, например,
int func(int x)
{
static int arr[5];
}
Но проблема в том, что я заранее не знаю размер массива (то есть он зависит от x). Итак, я должен объявить массив, используя «новый».
Можно ли это сделать так?
static int *arr=new int[x];
или я должен буду сделать:
static int *static arr = new int[x]
Если нет то
как это сделать?
static int *arr = new int[x];
все в порядке. Тем не менее, вам нужно беспокоиться об утечке памяти, так как нет хорошего повода для delete [] arr;
,
Как описано в комментариях, местный static std::vector<int> arr;
является предпочтительным, так как его деструктор вызывается автоматически в конце программы.
Я не думаю, что это законно.
Причина, по которой вы можете использовать переменные для «динамического» размера массива в области действия функции, заключается в AFAIK, потому что массив помещается в стек:
void foo(int x)
{
int bar[x]; // this is legal
} // but goes out-of-scope here :-(
Объявление массива static
разрушает это. Подумайте об этом так: у компоновщика нет шансов узнать размер массива, следовательно, он не может найти что-либо «за пределами» массива (явно нежелательно).
Так что в основном вам нужно использовать кучу через new
а также delete
, Или еще лучше использовать std::vector<>
как уже предлагалось (использует кучу внутри).