Фон
Я отлаживаю один проект с открытым исходным кодом, к которому я хочу присоединиться и выучить C ++.Затем я попытался расширить некоторые функциональные возможности, необходимые для решения одной из проблем, и наткнулся на интересный случай (никогда в жизни не встречал ничего подобного).
Исходный код
QuestSet Player::GetQuestForEvent(uint16 eventId) const
{
QuestSet eventQuests; // QuestSet is typedef for std::set<uint32>
for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
{
uint32 questId = GetQuestSlotQuestId(i);
if (questId == 0)
continue;
QuestStatusMap::const_iterator qs_itr = m_QuestStatus.find(questId);
if (qs_itr == m_QuestStatus.end())
continue;
QuestStatusData const& qs = qs_itr->second;
Quest const* qinfo = sObjectMgr->GetQuestTemplate(questId);
if (!qinfo)
continue;
if (qinfo->GetEventIdForQuest() == eventId)
eventQuests.insert(questId);
}
return eventQuests; <--- breakpoint here
}
Я заметилчто мой сервер аварийно завершает работу с
необработанное исключение в 0x00007FFE1BE6A388 (KernelBase.dll) в worldserver.exe: 0xC0000005: нарушение прав доступа.
, за которым следует этот журнал с моего сервера
C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.20.27508 \ include \ xtree (240): Ошибка подтверждения: сопоставить / установить итераторы вдиапазон из разных контейнеров
Итак, я поставил точку останова в вышеупомянутом месте и заметил, что функция вызывается дважды.Я знаю, что загрузка изображений может быть не лучшим вариантом, но, на мой взгляд, это лучшее объяснение в этом случае, поэтому взгляните.
Снимки экрана
Это единственное место в проекте, где вызывается эта функция.
void OnLogin(Player* player, bool /*firstLogin*/) override
{
QuestSet eventQuests = player->GetQuestForEvent(1);
/*std::for_each(eventQuests.begin(), eventQuests.end(), [&player](uint32 questId)
{
player->AbandonQuest(questId);
});*/
}
Я знаю, что это звучит глупо, но у меня нет предложений, не могли бы вы указать мне правильное направление, понимая, почемуэта точка останова удваивается дважды, скорее всего, исправит также и исключения.
Устранение неполадок:
- проект построен в конфигурации отладки
- callstack, thread и
this
objectвсе одинаковые в обоих хитах.