Í - это байт 0xCD, который распределитель отладки Windows записывает в ваши 15 байтов памяти, чтобы указать, что это неинициализированная куча памяти. Неинициализированный стек будет 0xCC. Идея состоит в том, что если вы когда-нибудь прочитаете память и неожиданно получите это значение, вы можете подумать про себя: «Хм, я, вероятно, забыл инициализировать это». Кроме того, если вы читаете его как указатель и разыменовываете его, то Windows приведет к сбою вашего процесса, тогда как если неинициализированный буфер был заполнен случайными или произвольными значениями, то иногда по счастливой случайности вы получаете действительный указатель, и ваш код может вызвать все виды неприятностей. C ++ не сообщает, какие значения хранит неинициализированная память, и не отладочные распределители не будут тратить время на заполнение памяти специальными значениями для каждого выделения, поэтому вы никогда не должны полагаться на то, что это значение находится там.
За этим следуют 4 байта ý (байт 0xFD), который используется распределителем отладки Windows для указания области за пределами допустимого диапазона в конце буфера. Идея в том, что если вы когда-нибудь окажетесь в отладчике, пишущем в регион, который выглядит следующим образом, вы можете подумать: «Хм, я, вероятно, переполнил мой буфер здесь». Кроме того, если значение изменилось при освобождении буфера, распределитель памяти может предупредить вас, что ваш код неверен.
«это байт 0xAB, а þ это 0xFE. Предположительно они также предназначены для привлечения внимания (они не являются правдоподобными указателями или смещениями, поэтому они не являются частью структуры кучи). Я не знаю, что они означают, возможно, больше защитных данных, таких как 0xFD.
Наконец, я думаю, вы нашли 0 байт, 16-й байт после конца вашего 15-байтового буфера (т. Е. 31-й байт, считая с начала).
Задавая вопрос "C ++", не упоминая, что вы работаете в Windows, можно предположить, что именно так ведет себя C ++. Дело не в том, как ведет себя одна реализация C ++, с конкретными параметрами компилятора и / или связанными библиотеками. C ++ не позволяет вам читать за пределами буфера, Microsoft просто любезна с вами и позволяет вам обойтись без сбоев или хуже.