Ответ 1
В каждой категории классов хранения (кроме динамически распределенных объектов) объекты разрушаются в обратном порядке построения.
Существует ли определенный порядок, в котором локальные переменные освобождаются в С++ (11)? Чтобы быть более кратким: в каком порядке будут видны побочные эффекты деструкторов двух локальных переменных в одной области?
например:.
struct X{
~X(){/*do something*/}
}
int main(){
X x1;
X x2;
return 0;
}
Является ли x1
или x2
уничтожен первым, когда main возвращает или является порядком undefined в С++ 11?
В каждой категории классов хранения (кроме динамически распределенных объектов) объекты разрушаются в обратном порядке построения.
I. О локальных переменных
Локальные переменные выделяются в стеке.
Стек основан на шаблоне LIFO
(Last-In-First-Out
).
Таким образом, переменные уничтожаются и освобождаются в порядке, обратном порядку размещения и построения.
II. Пример вашего примера
Вызывается функция main()
:
x1
выделяется и строится на стеке,x2
выделяется и создается на стеке и когда достигнут конец области main()
:
x2
уничтожается и освобождается от стека,x1
уничтожается и освобождается из стекаIII. Более того
Стек выглядит следующим образом:
(Поведение стека кажется более понятным по схеме)
Это поведение Stack Data Structure
, поэтому локальные переменные хранятся в Stack как структура данных LIFO (Last-In-First-Out)
, вы можете себе представить, что в структуре данных LIFO последняя переменная, добавленная в структуру, должна быть первой, которая будет удалена. переменные removed
из стека в reverse order
соответствуют порядку их добавления.
Они уничтожаются в порядке обратного выделения, см. этот вопрос SO. В этом случае это означает, что x2
будет уничтожен до x1
.
Они будут уничтожены после обратного порядка их построения.