Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2010, 16:18   #1
arokot
 
Регистрация: 03.08.2010
Сообщений: 3
Вопрос Исключение при удалении из std::map

Есть такой код:
Код:
    typedef struct WndProcsStrCmp{bool operator()(LPCTSTR s1, LPCTSTR s2) const {return _tcscoll(s1, s2)<0;}};
    typedef struct HWNDCmp{bool operator()(HWND s1, HWND s2) const {return (UINT_PTR)s1<(UINT_PTR)s2;}};
    typedef std::map<HWND, Widget*, HWNDCmp> _Classes;
    typedef std::map<LPCTSTR, WNDPROC, WndProcsStrCmp> _WndProcs;
    typedef std::map<LPCTSTR, unsigned long long, WndProcsStrCmp> _WndsCount;

    class Widget: public Messager
    {
        private:
            static_Classes Classes;
            static _WndProcs WndProcs;
            static _WndsCount WndsCount;

            friend LRESULT WindowProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);
    };
 ....
    LRESULT WindowProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
    {
        .......
        Widget::Classes.erase(hWnd);
        Widget::WndProcs.erase(szClassName);
        Widget::WndsCount.erase(szClassName);
        ....... 
        return Result;
    }
Так вот, при наличии вот этих строк:
Код:
        Widget::Classes.erase(hWnd);
        Widget::WndProcs.erase(szClassName);
        Widget::WndsCount.erase(szClassName);
происходят исключения...
Почему? Компилятор mingw32

Последний раз редактировалось arokot; 11.08.2010 в 18:18.
arokot вне форума Ответить с цитированием
Старый 11.08.2010, 17:14   #2
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Цитата:
Сообщение от arokot Посмотреть сообщение
Есть такой код:
Код:
    typedef struct WndProcsStrCmp{bool operator()(LPCTSTR s1, LPCTSTR s2) const {return _tcscoll(s1, s2)<0;}};
    typedef struct HWNDCmp{bool operator()(HWND s1, HWND s2) const {return (UINT_PTR)s1<(UINT_PTR)s2;}};
Что ж вы не всё в одну строку пишите, стиль не держите, ай-яй-яй.
Код:
std::map< T, U >::iterator i = mapobj.find( Tobj );
if( i != mapobj.end() )
  mapobj.erase( i );
Попробуйте так удалять.

И да, ловите исключение, смотрите что за оно.
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 11.08.2010, 17:36   #3
arokot
 
Регистрация: 03.08.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от ozo Посмотреть сообщение
Что ж вы не всё в одну строку пишите, стиль не держите, ай-яй-яй.
Да, всё эта эканомия места
Цитата:
Сообщение от ozo Посмотреть сообщение
Код:
std::map< T, U >::iterator i = mapobj.find( Tobj );
if( i != mapobj.end() )
  mapobj.erase( i );
Попробуйте так удалять.
И да, ловите исключение, смотрите что за оно.
Уже пробовал, и удалять этим способом, и отлавливал где происходит исключение... Проблема в том, что когда попытки удаления нет - то и никаких исключений не возникает, если я добавил код удаления (тем или иным способом) и поставил на него бряк (или даже без него) - происходит исключение, причем где-то ДО этого кода ...Программа просто падает... Если отловить где случилось это падение, то вот, в хедере stl_tree:
Код:
  template<typename _Key, typename _Val, typename _KeyOfValue,
           typename _Compare, typename _Alloc>
    typename _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::iterator
    _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::
    lower_bound(const _Key& __k)
    {
      _Link_type __x = _M_begin(); // Current node.
      _Link_type __y = _M_end(); // Last node which is not less than __k.

      while (__x != 0)
	if (!_M_impl._M_key_compare(_S_key(__x), __k)) // <-- ЗДЕСЬ ПАДАЕТ
	  __y = __x, __x = _S_left(__x);
	else
	  __x = _S_right(__x);

      return iterator(__y);
    }
Т.е. не получается ни обработать исключение, ни поймать место падения по брейкпойнту (даже на входе функции не останавливается!) потому что SIGSEGV... Судя по адресу, где происходит исключение, это ядерная память. Но вопрос то в том, что этого всего быть не должно, ведь это простое удаление элемента...

Последний раз редактировалось arokot; 11.08.2010 в 18:02.
arokot вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сортировка std::map NiCola999 Общие вопросы C/C++ 2 27.04.2010 23:14
Проблема при удалении(вырезании) файлов lionbeast Помощь студентам 3 11.10.2009 11:56
ошибка при удалении символа Virus191288 Общие вопросы Delphi 13 15.08.2009 14:50
Ошибка при удалении... JRcoker Общие вопросы Delphi 8 29.07.2008 22:53
Проблемы при удалении файлов Pavel55 Общие вопросы Delphi 7 10.01.2008 00:45