2012-08-20 2 views
0

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

Как именно называются деструкторы?

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

+0

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

ответ

3

Деструкторные вызовы высылаются компилятором в сгенерированном коде.

Например,

void foo() { 
    A a; 
} 

компилирует:

void foo() { 
    A::A(<stack-address-of-a>); 
    A::~A(<stack-address-of-a>); 
} 

Это немного сложнее, когда функция возвращает рано; Рассмотрим

void foo(int i) { 
    A a; 
    if (i) return; 
    B b; 
} 

как что-то вроде

void foo() { 
    A::A(<stack-address-of-a>); 
    B::B(<stack-address-of-b>); 
    if (i) goto destroy_a; 
    B::~B(<stack-address-of-b>); 
destroy_a: 
    A::~A(<stack-address-of-a>); 
} 

исключений немного сложнее снова; обычное решение включает области исключений и диапазоны, которые связывают необходимые вызовы деструктора с стеком вызовов. См. Exception Handling in LLVM.

1

Поскольку это стек (FILO), деструкторы вызывают в обратном порядке. Таким образом, последний созданный объект будет уничтожен первым.

Я хочу знать механизм, через который компилятор способен вызвать деструкторы объектов, которые находятся на стеке

Ну, если он ставит что-то в стек, он должен знать, как вытолкнуть его из стека, что, по-видимому, имеет смысл ... Вызовы добавляются в процессе компиляции.

Смежные вопросы