Здравствуйте, dcb-BanDos, Вы писали:
DB>Где грабли?
код
for (int j=0 ; j < 10 ; ++j)
{
}
int j=0;
printf("j = %d", j);
выведет 0 если ты смотришь в закладке watch то просто видешь j которое в цикле объявлено,
посмотри в закладке Locals там их вообще 2 штуки будет. Вообще это глюк дебагера не может в стеке разобраться
Здравствуйте, dcb-BanDos, Вы писали:
DB>Где грабли?
Грабли в том, что ты зачем-то завёл в одной функции две разные переменные j.
Они конечно одновременно существовать не должны, но деструктор у int тривиальный, а память на стеке компилятор может освобождать когда угодно, тем более в debug версии...
Ты всё время смотришь отладчиком на место в памяти, где лежит параметр цикла, а вторую j заводят где-то ещё.
Но ты запутываешь не только отладчик, но и читателя своей программы (а может и себя самого).
Не заводи в одной функции две одноимённые переменные и будет тебе счастье
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>у int нет деструктора, даже тривиального
Ну "существует ли тривиальный деструктор" -- прекрасная тема для теологического спора
Вот, например, аргумент за:
template<typename T> void f( T& t ) { t.~T(); }
void ggg()
{
int q;
f( q );
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали: E>Не заводи в одной функции две одноимённые переменные и будет тебе счастье
Я бы скорее сформулировал как "Не доверяй слепо дебагеру, и будет тебе счастье"
Дебагер это часто полезная штука, но из за многочисленных особенностей, к информации из дебагера стоит относится очень осторожно, не в коем случае не считая её истинной в последней инстанции.
"To protect people you must slay people. To let people live you must let people die. This is the true teaching of the sword."
-Seijuro Hiko, "Rurouni Kensin"
А верно ли это для тривиального деструктора? Например деструктора POD?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Грабли в том, что ты зачем-то завёл в одной функции две разные переменные j.
E>Они конечно одновременно существовать не должны, но деструктор у int тривиальный, а память на стеке компилятор может освобождать когда угодно, тем более в debug версии...
E>Ты всё время смотришь отладчиком на место в памяти, где лежит параметр цикла, а вторую j заводят где-то ещё. E>Но ты запутываешь не только отладчик, но и читателя своей программы (а может и себя самого). E>Не заводи в одной функции две одноимённые переменные и будет тебе счастье
Да это все понятно, хотел просто разобраться =)
Ничто не ограничивает полет мысли программиста так, как компилятор.
E>А верно ли это для тривиального деструктора? Например деструктора POD?
Если ты говоришь о POD, подразумевая int (а он тоже POD) — то нет у него никаких деструкторов. В свое время Элджер очень неудачно написал бред вроде "у целых тоже есть деструкторы, просто все разумные разработчики компиляторов оптимизируют — удаляют их". Т.е. возникало впечатление, что можно столкнуться с реализацией (от менее разумных разработчиков), где все же имеют место вызовы деструкторов для целых — и этот человек еще с пафосом об АРМе говорил в предисловии.
Of course, the code must be complete enough to compile and link.
КР>В завершении темы дам тебе хороший совет — не ставь точку с запятой после закрывающей фигурной скобки Постарайся избавиться от этой вредной привычки
я не ставлю, просто из начально было for (int j=0 ; j < 10 ; ++j);
для видимости скобки вставил, точку с запятой не убрал
Ничто не ограничивает полет мысли программиста так, как компилятор.
КР>В завершении темы дам тебе хороший совет — не ставь точку с запятой после закрывающей фигурной скобки Постарайся избавиться от этой вредной привычки