В STL не силен, сталкивался пару раз, да и то на пьяную голову, посему прошу совета у коллективного разума: Есть простая достаточно клиент-серверая прожка, которая туда-сюда гоняет данные. На сервере ведется учет клиентов в виде hash_map, что-то типа: typedef pair < UINT, USER_LIST_NODE * > clientsPair; hash_map < UINT, USER_LIST_NODE * > Clients; hash_map <UINT, USER_LIST_NODE *>::iterator UsersIterator; При логине нового клиента делается: USER_LIST_NODE currentUser; memset( ¤tUser, 0, sizeof(USER_LIST_NODE)); //заполняем структуру USER_LIST_NODE... Clients.insert( clientsPair( counter++, ¤tUser)); При LOGOUT клиента ищем его в хеше, и удаляем запись Код (Text): for(UsersIterator = Clients.begin(); UsersIterator != Clients.end(); UsersIterator++) { if( strcmp (UsersIterator->second->userName, receivedBuffer.message.logoutMember.userName) == 0) { Clients.erase( UsersIterator ); } } Трабла в том, что сравнение строк strcmp не всегда отрабатывает, при отладке видно, что в UsersIterator->second->userName после имени юзера набит мусор, но так бывает через раз, т.е. один раз функция отработает норм, а второй раз нет. Как можно разрулить ситуацию? Убедительная просьба не кидать помидорами, очень приветствуется конструктивные пинки в нужном направлении )
steelfactor Потому что ты удаляешь объект по итератору, а потом этот же итератор инкрементишь. Это неправильно. Надо так: Код (Text): auto it = container.begin() while(it != container.end()) { auto old = it++; if(условие с old) { действия с old; container.erase(old); } }
steelfactor Указатель на локальную переменную складывать тоже неправильно - если мапа живет дольше, чем локальная переменная, то в мапе будет мусор. Пивом не беру, предпочитаю деньги. Но это не тот случай