Я попытаюсь объяснить это на примере:
Скажем, у вас есть эта функция:
int myFunc() {
int n = 16;
int arr[n];
int k = 1;
}
Когда программа запускается, она устанавливает переменные таким образом в стек:
- n @relative addr 0
- arr[16] @relative addr 4
- k @relative addr 64
TOTAL SIZE: 68 bytes
Допустим, я хочу изменить размер arr до 4 элементов. Я собираюсь сделать:
delete arr;
arr = new int[4];
Теперь: если я оставлю стек таким образом, в стеке будут дыры неиспользуемого пространства. Поэтому самое разумное, что нужно сделать - это переместить все переменные из одного места в другое в стеке и пересчитать их позиции. Но нам чего-то не хватает: C ++ не устанавливает позиции на лету, это делается только один раз, когда вы компилируете программу. Зачем? Это просто: потому что нет реальной необходимости иметь объекты переменного размера в стеке, и потому что их наличие замедлит все программы при выделении / перераспределении стекового пространства.
Это не единственная проблема, есть другая, еще большая проблема:
Когда вы выделяете массив, вы решаете, сколько места он займет, и компилятор может предупредить вас, если вы превысите доступное пространство, вместо этого, если вы позволите программе распределять массивы переменного размера в вашем стеке, вы открываете нарушения в безопасности, так как сделать все программы, использующие этот метод, уязвимыми для переполнения стека.