Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > HeapAlloc вылетает


Автор: Graf Zeppelin 19.9.2008, 11:33
Привет всем, я программирую под Win достаточно мало и использую для этого VS 2005. Программа которую я пишу целиком написана на C, и там есть некоторое количество проблем с выделением памяти. Нижеследующий код после повторного(акцент не на этом) своего вызова крэшит программу
Код

WCHAR *szFNameW;
unsigned int size;
size = MAX_PATH*sizeof(WCHAR);
szFNameW = (WCHAR *)malloc(size);

Немного повозившись с дебаггером  я определил, что ошибка вызвана функцией HeapAlloc, которая вызывается на 105 строке библиотеки malloc.c. Размер памяти необходимой для выделения - 556 байт. Глобальная переменная _lTotalAlloc равна 21669(из кучи видимо выделен 21Кб памяти). Валится программа стабильно в этом месте.
Так же наблюдались проблемы с вызовом printf - так же вылетала программа и дебаггер показывал что корни уходят к выделению памяти. Ещё есть проблемы с вызовом free на конкретных указателях, но это уже может и не имеет непосредственного отношения к HeapAlloc.
Если нужен код программы целиком - могу выложить. Она небольшая и сделана чисто в образовательных целях.
Спасибо.

Автор: Lazin 19.9.2008, 11:39
что значит валится? 

Автор: Graf Zeppelin 19.9.2008, 11:52
Предлагает задебажиться и кидает в библиотеку wctomb.c(100-я строка). Предлагает вылетающим окошком с надписью 
Код

Windows has triggered a breakpoint in acl_matrix.exe.

This may be due to a corruption of the heap, and indicates a bug in acl_matrix.exe or any of the DLLs it has loaded.

The output window may have more diagnostic information

Винда - XP SP2

Автор: Lazin 19.9.2008, 12:16
ты перед вызовом malloc где-то испортил кучу, вот и вылетает, ошибка где-то в твоем коде и связана она с записью в динамическую память... HeapAlloc тут не причем 

Автор: Graf Zeppelin 19.9.2008, 12:57
Спасибо, буду смотреть. А какие наиболее вероятные механизмы "порчи" кучи?

Автор: Lazin 19.9.2008, 13:36
вариантов всего 2
  • ты записываешь в память после окончания твоего блока памяти
  • ты пишешь в память до начала твоего блока памяти

Автор: Graf Zeppelin 19.9.2008, 13:40
Нашёл, спасибо за направление. Проблема была в том, что я переписывая код в функции wcsncpy последний параметр, отвечающий за длину строки передавал умноженный на размер типа TCHAR. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)