Re: Heap corruption, непонятное поведение new
От: о_О
Дата: 07.05.12 16:18
Оценка: -1
Здравствуйте, zombiee, Вы писали:

выкинуть нахрен универсальные макросы, писать везде wchar_t
посмотреть какие параметры принимает wcscpy_s
Re: Heap corruption, непонятное поведение new
От: Sni4ok  
Дата: 07.05.12 16:25
Оценка: +1
Здравствуйте, zombiee, Вы писали:
Z>
Z>_tcscpy_s(sClass, iLen*sizeof(TCHAR), _T("RUAHM About Window Class")); // iLen*sizeof(TCHAR)=0x32=50
Z>


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


ваш код некорректен, если sizeof(TCHAR) > 1
зы не используйте мелкософтовские быдлоподелки, если не знаете что они делают, используйте стандартный std::copy.
Re[2]: Heap corruption, непонятное поведение new
От: Кодт Россия  
Дата: 08.05.12 18:12
Оценка: +1
Здравствуйте, Sni4ok, Вы писали:

S>зы не используйте мелкософтовские быдлоподелки, если не знаете что они делают, используйте стандартный std::copy.


Зачем std::copy, когда речь идёт о строке?! strcpy — легальный способ.
Другое дело, что размер строки нужно указывать правильно, т.е. в элементах, а не в байтах.
Перекуём баги на фичи!
Re[5]: Heap corruption, непонятное поведение new
От: Caracrist https://1pwd.org/
Дата: 08.05.12 19:23
Оценка: :)
Здравствуйте, zombiee, Вы писали:

Z>Могут быть причины перевода проекта с юникода на анси в любой момент (не спрашивайте, какие )

Враждебная пропаганда!
Я бы перепроверил
~~~~~
~lol~~
~~~ Single Password Solution
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. Разве так и надо? Я что-то где-то упустил?
Объясните, пожалуйста.

Заранее спасибо!
Re[2]: Heap corruption, непонятное поведение new
От: zombiee Россия http://artcoding.ru/
Дата: 07.05.12 16:25
Оценка:
Здравствуйте, о_О, Вы писали:
о_О>выкинуть нахрен универсальные макросы, писать везде wchar_t
Почему?

о_О>посмотреть какие параметры принимает wcscpy_s

не ожидал, что косяк будет именно в этом. И именно в моей не внимательности.
Огромное спасибо!
Re[3]: Heap corruption, непонятное поведение new
От: о_О
Дата: 07.05.12 16:42
Оценка:
Здравствуйте, zombiee, Вы писали:

о_О>>выкинуть нахрен универсальные макросы, писать везде wchar_t

Z>Почему?
а зачем?
Re[4]: Heap corruption, непонятное поведение new
От: zombiee Россия http://artcoding.ru/
Дата: 07.05.12 16:49
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>а зачем?

Могут быть причины перевода проекта с юникода на анси в любой момент (не спрашивайте, какие )
По этому приходится извращаться.
Re[5]: Heap corruption, непонятное поведение new
От: PM  
Дата: 07.05.12 16:55
Оценка:
Здравствуйте, zombiee, Вы писали:

Z>Могут быть причины перевода проекта с юникода на анси в любой момент (не спрашивайте, какие )

Z>По этому приходится извращаться.

ANSI не нужен. UTF-8 Everywhere Manifesto
Re: Heap corruption, непонятное поведение new
От: Caracrist https://1pwd.org/
Дата: 08.05.12 19:18
Оценка:
Здравствуйте, zombiee, Вы писали:

Z>
Z>_tcscpy_s(sClass, iLen*sizeof(TCHAR), _T("RUAHM About Window Class")); // iLen*sizeof(TCHAR)=0x32=50
Z>


http://msdn.microsoft.com/en-us/library/td1esda9(v=vs.80).aspx


Parameters:
strDestination
numberOfElements
strSource

~~~~~
~lol~~
~~~ Single Password Solution
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.