Почему не выделенная память помечена как 0xCC? [дубликат]

Возможные Дубликаты:
когда и почему ОС инициализирует память до 0xCD, 0xDD и т. д. на malloc / бесплатно/новый / удалить?

почему память, которую я не инициализировал, установлена в 0xCC?

настройки памяти 0xCC снизит производительность, поэтому должна быть причина для заполнения памяти этим байтом.

3 ответов


внутри CRT: отладка управления кучей

при компиляции отладочной сборки программы с помощью Visual Studio и запустите его в отладчике, вы увидите, что выделенная память или освобожденный имеет смешные значения, такие как...

0xCC когда код компилируется с параметром /GZ, неинициализированный переменные автоматически присваиваются этому значению (на уровне байтов).

магическое число Wiki:

CCCCCCCCCC используется библиотекой времени выполнения отладки Microsoft C++ для отметки неинициализированная память стека

в источнике CRT Visual Studio,\VC\crt\src\malloc.h:

#define _ALLOCA_S_STACK_MARKER  0xCCCC

// ...

#undef _malloca
#define _malloca(size) \
__pragma(warning(suppress: 6255)) \
    ((((size) + _ALLOCA_S_MARKER_SIZE) <= _ALLOCA_S_THRESHOLD) ? \
        _MarkAllocaS(_alloca((size) + _ALLOCA_S_MARKER_SIZE), _ALLOCA_S_STACK_MARKER) : \
        _MarkAllocaS(malloc((size) + _ALLOCA_S_MARKER_SIZE), _ALLOCA_S_HEAP_MARKER))

компилятор делает это для вас в режиме отладки, так что если вы случайно прочитаете неинициализированную память, вы увидите отличительное значение 0xCC и узнаете, что вы (вероятно) читаете неинициализированную память. Значение 0xCC имеет много других полезных свойств, например, это инструкция машинного языка для вызова аппаратной точки останова, если вы случайно выполняете некоторую неинициализированную память.

основной принцип: сделайте его легким определить значения которые приходят от чтение неинициализированной памяти.

этого не происходит в ваших сборках выпуска.

эта техника была введена в Написание Твердого Кода.


когда код компилируется с параметром /GZ, неинициализированные переменные автоматически присваиваются этому значению (на уровне байтов).

0xCC-это инструкция машинного кода для вызова точки останова. Для получения дополнительной информации см. Другой вопрос.