typedef std::vector<UCHAR> RESPONSE_BUFFER;
typedef TimedHashMap<int, RESPONSE_BUFFER*> TimeResponseHashMap;
Прототип внутренней карты имеет "целое" как ключ и "указатель на вектор символов" в качестве отображаемого значения.
TimeResponseHashMap* inner_pending_response_map;
Внешняя карта - это карта карт. он имеет "целое" как ключ и "указатель на внутреннюю карту" в качестве отображаемого значения.
std::map<int, TimeResponseHashMap* > outer_pending_response_map;
Я вставляю так: Внутренняя карта - это определяемая пользователем карта, поэтому она имеет другой формат.
inner_pending_response_map->Insert((int)s16MessageID, &resp_buffer, expirytime);
outer_pending_response_map.insert(make_pair((int)s16SessionID,
inner_pending_response_map));
TimeResponseHashMap предоставляет пользовательский интерфейс "Найти" для доступа к членам карты.
template <typename Key, typename ElementObject>
THM_ERROR TimedHashMap<Key, ElementObject>::Find(const Key& k, ElementObject& e)
{
typename hash_map<Key, BaseElement_*, dw_hash<Key>, dw_equal_to<Key> >::iterator itr;
try
{
itr = h_->find(k);
} catch ( ... )
{
return E_INTERNAL_ERROR;
}
if ( itr == h_->end() )
{
e = NULL;
return E_ITEM_NOT_FOUND;
}
e = itr->second->e_;
return E_SUCCESS;
}
У меня есть оба ключа, и теперь мне нужно получить доступ к "отображаемому значению" внутренней карты. На внутренней карте используется функция Find() для поиска. Мне нужно передать переменную RESPONSE_BUFFER в качестве второго параметра функции Find().
Я пытаюсь извлечь как это, что дает неправильный вывод:
RESPONSE_BUFFER resp_buffer;
ExtractFragmentResponse(u16Key1, u16Key2, &resp_buffer);
Определение ExtractFragmentResponse приведено ниже:
STATUS
C_THREAD::ExtractFragmentResponse(USHORT u16SessionID, USHORT u16MessageID,
RESPONSE_BUFFER* resp)
{
(((outer_pending_response_map.find(u16SessionID))->second)->Find((int)u16MessageID, resp))
}
resp не дает мне правильных данных. Как это можно сделать?
Это не может напрямую ответить на вопрос, но это порождает, почему используемый код сильно ошибочен и должен быть разбит на несколько строк.
STATUS
C_THREAD::ExtractFragmentResponse(USHORT u16SessionID, USHORT u16MessageID,
RESPONSE_BUFFER* resp)
{
(((outer_pending_response_map.find(u16SessionID))->second)->Find((int)u16MessageID, resp))
}
Пусть говорят, что это действительно "работало". Есть большая проблема с этим, независимо. Проблема заключается в следующем:
outer_pending_response_map.find(u16SessionID)
Что произойдет, если find
не найдет запись u16SessionID
? Теперь вы вернулись outer_pending_response_map.end()
. Когда это возвращаемое значение используется следующим образом:
outer_pending_response_map.end()->second
бум, ваши мертвые. Эта строка пытается использовать недопустимый итератор, который является неопределенным поведением.
Что вы должны сделать, так это:
std::map<int, TimeResponseHashMap* >::iterator it1 = outer_pending_response_map.find(u16SessionID);
if ( it1 != outer_pending_response_map.end())
(it1->second)->Find((int)u16MessageID, resp);
else
{
// you fill in what happens if the find fails
}
Чтобы отладить свою проблему, вы можете продолжить разбивку строк, чтобы убедиться, что вы получаете:
std::map<int, TimeResponseHashMap* >::iterator it1 = outer_pending_response_map.find(u16SessionID);
if ( it1 != outer_pending_response_map.end())
{
TimeResponseHashMap *theMap = it1->second;
theMap->Find((int)u16MessageID, resp);
}
else
{
// you fill in what happens if the find fails
}
В приведенном выше коде сохраняется it1->second
значение (theMap
), которое вы можете легко проверить, чтобы убедиться, что оно правильно.
TimedHashMap
?