Можно ли использовать локально выделенную память для будущего использования?

Для кода

int main() {
int test;
cin >> test;
while (test--) {
int arr[100];
arr[0] = 0;
}
return 0;
}

предполагать test = 3,
Для первого теста, массив размещается по адресу 1000, Для второго контрольного примера массив размещен в 2000 и так далее. Итак, если у нас много тестов, можно ли использовать наш предыдущий адрес выделенной памяти для дальнейшего распределения? Это автоматически «free ()» наша предыдущая выделенная память или просто не может использоваться дальше?

4

Решение

Если вы выделите массив со следующим кодом, вы выделите память в стеке. Как только ваш код достигнет конца области видимости (который является фигурной скобкой), появится стек, и вы больше не сможете получить доступ к этой части памяти. Да, это освобождается автоматически.

//anything here

{
int arr[100];
}

// can not access arr

Если вы хотите получить доступ после фигурных скобок (я на самом деле имею в виду изменение области видимости), вам нужно выделить память в куче для этого массива. Вы можете сделать это либо с помощью new ключевое слово или malloc() , Но на этот раз вам нужно освободить память (больше не нужно автоматически освобождать) с помощью delete а также free(), последовательно.

//anything here
int* arr
{
arr = new int[100];
}

// can access arr
delete [] arr

Пожалуйста, имейте в виду, что выделение памяти в стеке происходит быстрее, но его размер
ограничено.

2

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

arr является автоматической переменной с областью блока Вы можете использовать его, взять его адрес и т. Д., Только внутри блока, в котором он объявлен. Это то, что говорит языковая спецификация. Он «оживает», когда мы входим в блок, и умирает, когда мы выходим из блока выхода. И это происходит каждый раз выполнение проходит через этот блок; каждая итерация цикла.

Компиляторы используют это требование в языке C ++. Вместо увеличения использования памяти вашей программой, вполне вероятно, что компилятор будет повторно использовать одно и то же хранилище для каждой итерации цикла.

7

Компилятор будет выделять и освобождать память в стек для вас, если вы позвоните int arr[100] (то есть он будет освобожден после выхода из области видимости переменной). Если вы хотите управлять памятью самостоятельно, вам нужно использовать int *p = new int[100] и память будет выделена в куча которым ты можешь управлять сам. Память останется выделенной, пока вы не позвоните delete[], Если вы не используете delete[] после того, как вам больше не нужна память, вы получите утечка памяти.

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