Порядок уничтожения стековых объектов строго определен - они выполняются в порядке, обратном объявлению, когда вы покидаете область действия (либо выполняя конец {}
, либо return
, либо исключением) , Итак, вы будете всегда видеть 123
там.
Обратите внимание, однако, что оптимизации компилятора регулируются правилом «как будто». Другими словами, компилятор может уничтожить объект на ранней стадии, если результирующая программа ведет себя так, как если бы она была уничтожена в обычное время. В этом случае, поскольку вы делаете вывод, компилятор должен запланировать вывод в нужное время. Однако, если у вас есть, например, delete
d указатель на примитивный тип, и компилятор может доказать, что нет других выдающихся указателей на это значение, он в принципе мог бы переместить этот delete
раньше. Ключ в том, что ни одна соответствующая программа не способна заметить эту оптимизацию.