Для кода
int main() {
int test;
cin >> test;
while (test--) {
int arr[100];
arr[0] = 0;
}
return 0;
}
предполагать test = 3
,
Для первого теста, массив размещается по адресу 1000
, Для второго контрольного примера массив размещен в 2000
и так далее. Итак, если у нас много тестов, можно ли использовать наш предыдущий адрес выделенной памяти для дальнейшего распределения? Это автоматически «free ()» наша предыдущая выделенная память или просто не может использоваться дальше?
Если вы выделите массив со следующим кодом, вы выделите память в стеке. Как только ваш код достигнет конца области видимости (который является фигурной скобкой), появится стек, и вы больше не сможете получить доступ к этой части памяти. Да, это освобождается автоматически.
//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
Пожалуйста, имейте в виду, что выделение памяти в стеке происходит быстрее, но его размер
ограничено.
arr
является автоматической переменной с областью блока Вы можете использовать его, взять его адрес и т. Д., Только внутри блока, в котором он объявлен. Это то, что говорит языковая спецификация. Он «оживает», когда мы входим в блок, и умирает, когда мы выходим из блока выхода. И это происходит каждый раз выполнение проходит через этот блок; каждая итерация цикла.
Компиляторы используют это требование в языке C ++. Вместо увеличения использования памяти вашей программой, вполне вероятно, что компилятор будет повторно использовать одно и то же хранилище для каждой итерации цикла.
Компилятор будет выделять и освобождать память в стек для вас, если вы позвоните int arr[100]
(то есть он будет освобожден после выхода из области видимости переменной). Если вы хотите управлять памятью самостоятельно, вам нужно использовать int *p = new int[100]
и память будет выделена в куча которым ты можешь управлять сам. Память останется выделенной, пока вы не позвоните delete[]
, Если вы не используете delete[]
после того, как вам больше не нужна память, вы получите утечка памяти.