Как уничтожение локальных переменных при выходе из блока обычно вызывается в C ++? - PullRequest
8 голосов
/ 09 апреля 2010

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

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

Ответы [ 6 ]

5 голосов
/ 09 апреля 2010

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

3 голосов
/ 09 апреля 2010

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

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

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

2 голосов
/ 09 апреля 2010

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

1 голос
/ 09 апреля 2010

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

1 голос
/ 09 апреля 2010

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

1 голос
/ 09 апреля 2010

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

Полагаю, это называется "выходить за рамки".

...