访问地图地图中的值

时间:2014-08-25 20:35:35

标签: c++ pointers maps std

typedef std::vector<UCHAR> RESPONSE_BUFFER;
typedef TimedHashMap<int, RESPONSE_BUFFER*> TimeResponseHashMap;

内部地图原型有&#34;整数&#34;作为键和#34;指向字符向量的指针&#34;作为映射值。

TimeResponseHashMap* inner_pending_response_map;

外地图是地图的地图。它有&#34;整数&#34;作为键和&#34;指向内部地图的指针&#34;作为映射值。

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提供用户定义的界面&#34;查找&#34;访问地图成员。

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;
}

我有两个键,现在我需要访问&#34;映射值&#34;内部地图。内部地图使用上面的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没有给我正确的数据。 怎么办呢?

1 个答案:

答案 0 :(得分:1)

这可能不能直接回答这个问题,但它确实会提到为什么使用的代码非常错误,应该分解成几行。

STATUS
C_THREAD::ExtractFragmentResponse(USHORT u16SessionID, USHORT u16MessageID, 
RESPONSE_BUFFER* resp)
{
  (((outer_pending_response_map.find(u16SessionID))->second)->Find((int)u16MessageID, resp))
}

让我们说这实际上确实&#34;工作&#34;。无论如何,它存在一个主要问题。问题是:

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),您可以轻松检查它是否正确。