Для переменных, объявленных в стеке, деструктор вызывается, а память освобождается по мере выхода из области видимости.
Обратите внимание, что это не означает в конце функции, если переменная объявлена во внутреннем блоке, как оператор if или цикл.
int main(int argc, char **argv)
{
int a = 3;
if (argc > 1)
{
int b = 5;
++b;
} // b is destructed here
// a is destructed here
// argv and argc are destructed here (or with a)
}
РЕДАКТИРОВАТЬ : Было сделано хорошее замечание о том, что не имеет значения, как выходит область действия. Итак ...
#include <vector>
# include <exception>
int main(int argc, char **argv)
{
std::vector<int> myVector(10);
try
{
if (argc)
{
int a = 10;
int b = 12;
for (int c = 0; c < b; c++) // lol
{
int c_squared = c*c;
int theEleventhElement = myVector.at(c);
// the above will throw std::out_of_range at some point!
}
}
}
catch (std::out_of_range &ex)
{
// do nothing
}
}
Когда вышеприведенные броски, стек будет разматываться как часть обработки исключений. Таким образом, переменные будут уничтожены в следующем порядке:
c_squared
c
b
и a
(думаю, в таком порядке, но я не знаю, предусмотрено ли это в стандарте)
На этом этапе, наконец, есть обработчик перехвата с только myVector
в области видимости. Этот блок игнорирует исключение, и затем main
заканчивается - в ЭТОЙ точке myVector
разрушается.