Цитирование "C++ язык программирования" (специальное издание, раздел 4.9.6, "Объекты и Lvalues"), и как хорошо известно:О масштабах и жизни
[...] объект объявлен в функции создается, когда ее определение встречается и уничтожается, когда его имя выходит за пределы области действия
OK! И в разделе 4.9.4:
Имя может использоваться только в определенной части текста программы. Для имени, объявленного в функции, эта область простирается от ее точки объявления до конца блока, в котором происходит его объявление.
Все это звучит отлично!
Но мой вопрос: как может быть уничтожена (авто) переменная, когда элемент управления достигнет конца своего блока? И подтекст: это на самом деле?
Например:
int main()
{
int* c = 0;
{
int b = 999;
c = &b;
} // End of the scope of b...
std::cout << b; // ... so this is illegal
// But ...
std::cout << *c; // ... is OK, so 'b' has not really been destroyed
}
Я понимаю, что локальная переменная уничтожается при выходе из сферы его функции из-за связанных с стека вещей, участвующих в вызове функции. Но при выходе из простого блока { // ... }
ничего не происходит.
Это конкретный язык, который приводит к неопределенному поведению (в моем случае последний cout
фактически не определен), но это на практике без эффекта при исполнении (ничего не выполняется для уничтожения объекта)?
Спасибо!
Редактировать 1: Я не рассматриваю статические переменные.
Редактировать 2: В случае, когда переменная является объектом с деструктором, была понятна мне, я спрашивал о нецелевых переменных.
Лучшим способом увидеть, что делает код, является «b» - объект, класс которого имеет деструктор. – Pointy
Это хороший пример того, почему плохая идея использовать компилятор, чтобы рассказать вам, что есть и что не так. C++. –
На самом деле это совсем наоборот, поскольку я читаю TC++ PL, чтобы иметь правильные определения, которые я пытаюсь использовать с примерами и что я спрашиваю здесь ... –