Согласно этому вопросу , Visual C ++ 2005 (а также 2008/2010) неправильно обнуляет элементы данных.
Поскольку у меня есть код, который требует стандартного поведения и который вылетает в режиме выпуска (а не в отладке), я подозреваю, что проблема возникает здесь.
Теперь проблема в том, что база кода достаточно велика, и проверка классов вручную затруднена.
Есть ли опция компилятора, чтобы вызвать предупреждение об этом нестандартном поведении MSVC? С / W4 вы получаете предупреждения о некоторых нестандартных расширениях (преобразованиях из rvalues в ссылки, пропущенном ключевом слове typename
), но не для этой конкретной проблемы.
РЕДАКТИРОВАТЬ: я подозреваю, что подобный код вызывает проблемы (вставлено из связанного вопроса)
include <cassert>
struct B { ~B(); Foo* m; };
int main()
{
B * b= new B();
assert ( b->m ==0);
}
в других частях кода у меня есть такие вещи, как
B* b = new B();
, а затем, позже,
if (b->m) { b->m->bar(); }
и b->m
должны быть равны нулю по стандарту, но, скорее всего, нет (за исключением режима отладки). Я хотел бы обнаружить такой код (например, предупреждение «m
используется без инициализации» или что-то в этом роде)