MSVC инициализация кучи при заполнении - PullRequest
0 голосов
/ 07 декабря 2011

Менеджер памяти MSVC имеет определенные шестнадцатеричные коды, которые он использует в сборках отладки, чтобы пометить память в зависимости от того, какая операция была выполнена. Это документировано здесь .

В частности, код 0xCDCDCDCD используется для маркировки выделенной, но неинициализированной памяти кучи. Предположим, у меня есть следующая структура:

struct Test
{
   bool foo;
   int value;

   Test() : foo(false), value(0) {}
};

Когда я выделю этот объект, будет ли моя память выглядеть следующим образом (обратите внимание, что я записываю шестнадцатеричные байты в том порядке, в котором они будут отображаться по порядку, в этом примере не учитывалась последовательность)?

00 CD CD CD CD 00 00 00 00

Выше 00 CD CD CD представляет 4-байтовое выровненное логическое значение. Последние 3 байта равны 0xCD, потому что менеджер памяти инициализировал эти значения на CD, однако фактическая инициализация этого логического значения в структуре касается только 1 байта, поскольку логическое значение представляет только 1 байт на моем компьютере.

Это правильное поведение?

Ответы [ 2 ]

3 голосов
/ 07 декабря 2011

Просто попробуйте. Не забудьте скомпилировать с /MDd или чем-то подобным для ссылки на среду выполнения отладки. (Ответ да в VS2010).

1 голос
/ 07 декабря 2011

Нет ничего, что могло бы помешать генератору кода записать 4 байта, если это даст более быстрый код. Или используйте memset (), общую оптимизацию в компиляторе MSVC. Но этого явно не произошло. В любом случае, чтение структуры является неопределенным поведением.

...