Леди и джентльмены,
никак не разберусь с одной головоломкой.
В отладочной сборке при вызове 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).