Народ!! Пишу приложение клиент/сервер с сокетами на MSVS.NET 2003. Чего только не делал. Все работает как надо. Только при завершении клиента выскакивает Debug Assertion Failed ... Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse). Смотрел в MSDN там вроде написано,что это баг в файле dbgdel.cpp. Как лечить??
Скорее баг в коде. Портится какой-то из блоков хипа. Это не всегда заметно сразу (особенно в релизе), но зато потом выскакивают ассерты (или вообще прога валится).
Т.е. внимательнее смотреть на все new + delete?? А как компиллер относится к структурам у которых есть конструктор, деструктор и/или пара функций??
Нет, внимательно смотреть, не портит ли код память до/после выделенного куска памяти. Нормально относится. С его т.з. (или Страуструпа) структуры - это классы с членами, которые по умолчанию открытые.
После 4-х часов вчера и часа сегодня результат такой: исправил пару опечаток в операторе присваивания и еще кое-где. Но проблема еще не решена. Я заменил все new + delete на свои макросы #define NEW(es,c) (es*)::GlobalAlloc(LPTR,(sizeof(es)*(c))) #define MYDELETE(ptr) ::GlobalFree((ptr)) Теперь при запуске без отладчика все ок. >:| А при запуске сервера под отладчиком - исключение ЮзерБрякпоинт на одном из MYDELETE (бряки я не ставил!!!). Народ, у кого время есть, в аттаче исходники. Плз, помогите. Ну не знаю чего дальше делать. _225024951__Chat.rar
Вот чего нарыл: <ol type=1> <li> прога падает при удалении из контейнера STL (list) объекта класса Packet. Конкретнее - при вызове list::pop_front() в деструкторе моего класса при вызове GlobalFree(). <li> проверил (раз 10 + переписывал код): нигде за границы выделленой памяти код не выходит (разумеется, мог и пропустить...) <li> в статье прочитал, что это может происходить из-за многопоточности: у меня память выделяется в одном потоке, а удаляется в другом. Цитата из статьи: </ol> У кого есть какие соображения, мнения, опыт и т.д. - поделитесь плз.
Доктор, меня игнорируют ... *( Короче, проблему я вчера решил. Заменил элемент контейнера: теперь это не класс а структура (без деструктора). Естественно, приходится корректно работать с памятью до и после добавления, но раз нет другого решения - будет так. Вопрос остается открытым. Почему??.. Раз никто не отвечает, закрываю топик. Спасибо IceStudent.
Структурам тоже можно давать деструкторы. Не используй GlobalXX, это старьё. Для цпп new/delete, тем более, что в отладке они особо проверяют выход за границы выделенной памяти, легче искать ошибки.