Сразу уточню, что сейчас мы будем говорить о локальных переменных, так как память, в которой располагаются статические и глобальные переменные, согласно требований стандарта обнулена.
Насколько я помню, студии всех версий ведут себя в отношении локальны переменных одинаково.
Режим Debug как раз предназначен для отлова подобных ошибок, поэтому в Debug в неинициализированных локальных переменные хранится 0xcccccc (некая попытка написать слово clear), а при вызове delete для поинтера в поинтер прописывается 0xfefefefe (некая попытка написать слово free).
В режиме Release в локальную переменную просто ничего не прописывается, потому после того, как была выполнена команда
sub esp, sizeof_variable, то есть было выделено место под локальную переменную, после этого в переменной будет хранится то, что до этого лежало по этому адресу в стеке, а так, как лежать могло что угодно, то фактически там лежит мусор.
Хотя
BBB был не совсем точен, тем не менее мы видим, что поведение в Debug и Release в случае отсутствии инициализации действительно отличается и это может стать причиной некорректной работы программы. Вообще такие ошибки ищутся достаточно просто, так как студия пишет warning, если локальная переменная будет использована для чтения до того, как мы её проинизиализировали. Именно поэтому я предпочитаю в своих программах исправлять не только все error, но и все warning
Есть причина, по котороя я сомневаюсь, что дело в неинициализированных данных, хотя это всего лишь сомнения - уверенности нет. Причина проста. Неинициализированные данные, как правило, выливаются в краш. Здесь же мы краша не наблюдаем. Если перестала вызываться какая-то функция, то скорее всего она была взята в ASSERT, в то время, как правильно её было взять в VERIFY.