Я не следую - если для неинициализированной памяти задано что-то вроде 0xcdcdcdcd
вместо 0, то лучше для удаления ошибок, потому что код, скорее всего, получит арифметику «в диапазоне» или специально обработает 0 С очень недопустимым значением ошибки, скорее всего, «быстро провалится», поэтому их можно исправить вместо скрытых.
Значения, которые использует отладочная сборка MSVC, специально разработаны, чтобы помочь вызвать сбои, которые могут быть легко обнаружены:
- они не равны 0, поэтому проверка указателя NULL на неинициализированную память не скрывает ошибку
- они не являются действительными указателями, поэтому разыменование неинициализированных указателей приведет к нарушению доступа
- они не являются «обычными» целочисленными значениями, поэтому вычисления с использованием неинициализированных данных обычно приводят к крайне некорректным результатам, что может привести к заметным сбоям (я думаю, что будет отрицательным, когда обрабатываются подписанные данные, что тоже немного помогает в этом, но не так просто, как просто необычные цифры).
Кроме того, их легко распознать на дисплеях данных в отладчике. Ноль не так сильно выделяется.
Все это говорит о том, что MSVC предоставляет несколько отладочных хуков / API, которые вы можете использовать для выполнения действий, которые вы хотите:
Некоторая дополнительная информация в ответ на ваш обновленный вопрос:
Возможно, вы сможете использовать стороннюю библиотеку для отладки, например Dmalloc (http://dmalloc.com/)), но я, честно говоря, не знаю, насколько просто интегрировать эти библиотеки в проект MSVC, особенно в "реальном мире".
Также обратите внимание, что они, очевидно, будут иметь дело только с динамическим распределением (и могут плохо интегрироваться со стандартной реализацией MSVC new
).
Вы можете использовать глобальное переопределение operator new()
для работы с выделениями, которые происходят с использованием new
в C ++ - нет проблем с перезаписью любых допустимых инициализаций конструктора - распределение new
происходит до того, как конструктор выполняет любую инициализацию (если вы подумаете об этом на мгновение, должно быть понятно, почему это так).
Кроме того, вы можете рассмотреть возможность перехода на Visual Studio 2010 - он будет зависать в отладчике при использовании неинициализированной локальной переменной - не делая ничего особенного, кроме запуска сборки Debug под отладчиком. Конечно, MSCV некоторое время предупреждал о многих из этих ситуаций, но VS2010 обнаружит следующее в отладчике, который не выдает предупреждений (по крайней мере, с моими текущими настройками компилятора):
int main( )
{
unsigned int x;
volatile bool a = false;
if (a) {
x = 0;
}
printf( "Hello world %u\n", x); // VS2010 will break here because x is uninitialized
return 0;
}
Даже версия Express VC ++ 2010 поддерживает это.