Как уничтожает локальные переменные, когда из блока обычно выходят названный в C++?

C++ автоволшебно называет деструкторы всех локальных переменных в блоке в обратном порядке независимо от того, выходят ли из блока обычно (управление проваливается), или исключение выдается.

Похож на термин стек, раскручивающийся, только относится к последнему. Как бывший процесс (нормальный выход блока) назван относительно уничтожения локальных переменных?

8
задан sharptooth 9 April 2010 в 05:52
поделиться

6 ответов

Объект автоматически уничтожается, когда он «выходит за пределы области видимости». Это можно назвать «автоматическим освобождением хранилища», но на самом деле это относится к сборке мусора (есть несколько статей с этой фразой в названии, в которых этот термин используется для обозначения сборки мусора). Когда он используется для обеспечения правильного сочетания открытия / закрытия, блокировки / разблокировки или других форм получения ресурсов с их соответствующим выпуском, тогда он известен как шаблон проектирования Получение ресурсов - инициализация (RAII) , что несколько иронично, учитывая, что основным аспектом RAII является не инициализация или получение ресурса, а его уничтожение.

5
ответ дан 5 December 2019 в 12:57
поделиться

Раскрутка стека происходит в обоих этих случаях, просто при нормальном выполнении стек раскручивается только в контексте вызывающего метода (или блока), когда выполняющийся метод возвращается (или блок выходит). Локальные переменные размещаются в стеке, поэтому они очищаются в обратном порядке распределения, и именно этот процесс называется раскручиванием. Это ничем не отличается от обработки любого другого типа данных, которые вы храните в структуре LIFO - например, отменить повторить.

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

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

3
ответ дан 5 December 2019 в 12:57
поделиться

Я всегда слышал, как это произносится как «выход за рамки» или, точнее, «переменная auto идет вне рамок ".

1
ответ дан 5 December 2019 в 12:57
поделиться

Если вы спрашиваете, как вызов метода фактически реализован в машинном коде, я бы сказал, что это будет зависеть от используемого соглашения о вызовах

1
ответ дан 5 December 2019 в 12:57
поделиться

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

Назовите это "выходом за пределы области видимости", я думаю.

1
ответ дан 5 December 2019 в 12:57
поделиться

Локальная переменная уничтожается, когда она выходит из области видимости. Возможно, этот процесс называется как "выход за пределы области видимости"

?
2
ответ дан 5 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: