Heap corruption, непонятное поведение new
От: zombiee Россия http://artcoding.ru/
Дата: 07.05.12 16:04
Оценка:
Здравствуйте!

Собственно, началось все с того, что при написании класса стала портиться куча после инициализации массива TCHAR
Экспериментальным путем дошел до того, что:
size_t iLen=_tcslen(_T("RUAHM About Window Class")); // len=0x18=24 // подстраховка, мало ли о_О
TCHAR *sClass=new TCHAR[++iLen]; // iLen+1=0x19=25 (++ for null-terminated)
ZeroMemory(sClass, iLen*sizeof(TCHAR)); // iLen*sizeof(TCHAR)=0x32=50
_tcscpy_s(sClass, iLen*sizeof(TCHAR), _T("RUAHM About Window Class")); // iLen*sizeof(TCHAR)=0x32=50
delete []sClass; // HEAP[RUAHM_About.exe]: Heap block at 00AD35A0 modified at 00AD35FE past requested size of 56


Если идти в недра CRT, видно, что в new передается как раз не 0x19 (25), а 0x32 (50), т.е выделяются нужные 50 байт памяти.
После я копирую строку длинной 0x19 (25) (+ завершающий ноль) (Unicode строка, 2 байта на один символ) — на этом куча портится.
Это все в debug версии, в release проблем нет О_о

Вопрос: Что я делаю не так?

P.S: код
TCHAR *s=new TCHAR[++iLen*sizeof(TCHAR)]; // (iLen+1)*2=0x32=50 (++ for null-terminated)

Уже не вызывает проблем, но выделяется же 100 байт памяти, а не 50. Разве так и надо? Я что-то где-то упустил?
Объясните, пожалуйста.

Заранее спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.