Debug Assertion Failed

Тема в разделе "WASM.WIN32", создана пользователем DrSex, 24 мар 2006.

  1. DrSex

    DrSex Юрий

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    98
    Адрес:
    Россия
    Народ!!

    Пишу приложение клиент/сервер с сокетами на MSVS.NET 2003.

    Чего только не делал. Все работает как надо. Только при завершении клиента выскакивает Debug Assertion Failed ...

    Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse).

    Смотрел в MSDN там вроде написано,что это баг в файле dbgdel.cpp.



    Как лечить??
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Скорее баг в коде. Портится какой-то из блоков хипа. Это не всегда заметно сразу (особенно в релизе), но зато потом выскакивают ассерты (или вообще прога валится).
     
  3. DrSex

    DrSex Юрий

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    98
    Адрес:
    Россия
    Т.е. внимательнее смотреть на все new + delete??



    А как компиллер относится к структурам у которых есть конструктор, деструктор и/или пара функций??
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Нет, внимательно смотреть, не портит ли код память до/после выделенного куска памяти.





    Нормально относится. С его т.з. (или Страуструпа) структуры - это классы с членами, которые по умолчанию открытые.
     
  5. DrSex

    DrSex Юрий

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    98
    Адрес:
    Россия
    Пасибо. Буду глядеть. ;)
     
  6. DrSex

    DrSex Юрий

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    98
    Адрес:
    Россия
    После 4-х часов вчера и часа сегодня результат такой: исправил пару опечаток в операторе присваивания :) и еще кое-где. Но проблема еще не решена.



    Я заменил все new + delete на свои макросы

    #define NEW(es,c) (es*)::GlobalAlloc(LPTR,(sizeof(es)*(c)))

    #define MYDELETE(ptr) ::GlobalFree((ptr))



    Теперь при запуске без отладчика все ок. >:| А при запуске сервера под отладчиком - исключение ЮзерБрякпоинт на одном из MYDELETE (бряки я не ставил!!!).



    Народ, у кого время есть, в аттаче исходники. Плз, помогите. Ну не знаю чего дальше делать.

    [​IMG] _225024951__Chat.rar
     
  7. DrSex

    DrSex Юрий

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    98
    Адрес:
    Россия
    Вот чего нарыл:

    <ol type=1>

    <li> прога падает при удалении из контейнера STL (list) объекта класса Packet. Конкретнее - при вызове list::pop_front() в деструкторе моего класса при вызове GlobalFree().

    <li> проверил (раз 10 + переписывал код): нигде за границы выделленой памяти код не выходит (разумеется, мог и пропустить...)

    <li> в статье прочитал, что это может происходить из-за многопоточности: у меня память выделяется в одном потоке, а удаляется в другом. Цитата из статьи:





    </ol>



    У кого есть какие соображения, мнения, опыт и т.д. - поделитесь плз. :dntknw:
     
  8. DrSex

    DrSex Юрий

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    98
    Адрес:
    Россия
    Доктор, меня игнорируют ... *(



    Короче, проблему я вчера решил. Заменил элемент контейнера: теперь это не класс а структура (без деструктора). Естественно, приходится корректно работать с памятью до и после добавления, но раз нет другого решения - будет так.



    Вопрос остается открытым. Почему??..

    Раз никто не отвечает, закрываю топик.

    Спасибо IceStudent.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Структурам тоже можно давать деструкторы. Не используй GlobalXX, это старьё. Для цпп new/delete, тем более, что в отладке они особо проверяют выход за границы выделенной памяти, легче искать ошибки.