отладочный delete и OPENFILENAME для Win2000/XP/2003
От: svmich Россия  
Дата: 26.12.04 11:26
Оценка:
Леди и джентльмены,
никак не разберусь с одной головоломкой.

В отладочной сборке при вызове delete с указателем на объект моего класса, после завершения моего деструктора, не выполняется контрольная проверка для отладочной сборки ("Debug assertion failed..."). Перед этим отладчик выдаёт два окошка с сообщением "User breakpoint called from code ..." с указанием адреса.

Мой анализ показал следующее. Частью данных объекта является структура OPENFILENAME. Сборка выполняется для _WIN32_WINNT = 0x0500 (т.е. Win2000 или выше), то есть обязательные для инициализации в OPENFILENAME поля pvReserved, dwReserved и FlagsEx в этой версии структуры есть. Так вот, если НЕ выполнять инициализацию только этих трёх полей в моём конструкторе, то вышеупомянутой ошибки не происходит, иначе ошибка. При обычной сборке (Release) никаких признаков ненормальной работы конечно не видно.

До записи свежего Platform SDK я использовал тот, что поставлялся с MSVC++ 6.0. Теперь подключаемые (Include) и библиотечные (Library) файлы ищутся в первую очередь в соответствующих директориях свежего SDK. Может быть, дело в одном из устаревших исходников (Source), — скажем, CRT\SRC\DBGHEAP.C?

Стек вызова при возникновении "Debug assertion failed..." такой:

int _CrtIsValidHeapPointer(const void*)
void _free_dbg(void*, int)
operator delete(void*)

Сообщения "User breakpoint called from code..." появляются при стеке

(на этом месте 4 уровня вызова в NTDLL)
BOOL HeapValidate(HANDLE, DWORD, LPCVOID)
int _CrtIsValidHeapPointer(const void*)
void _free_dbg(void*, int)
operator delete(void*)

Хочется понять, почему это происходит и как оно связано с инициализацией трёх последних полей OPENFILENAME (для Win2000/XP/2003).

Есть у кого-нибудь соображения на этот счёт?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.