STL地图查找无法正常工作

时间:2016-04-27 03:55:42

标签: c++ dictionary stl

我的地图中包含1323条记录,这些记录按以下方式填写:

std::map<uint32_t, House*> m_houses;
[...]

void OnReceiveHousePacket(HouseTable_t* recvTable, int32_t size) {
     m_houses.clear();

     for (int32_t i = 0; i < size; ++i, ++recvTable) {
          House* h = new House;
          memcpy(&h->table, recvTable, sizeof (HouseTable_t));
          m_houses.insert(std::make_pair(recvTable->clientId, h));
     }
}

我遇到的问题是,当我试图按键找到记录时:

const House* Get(uint32_t clientId) {
    auto it = m_houses.find(clientId);

    if (it == m_houses.end()) {
        return nullptr;
    }

    return it->second;
}

它返回nullptr,虽然密钥存在但我确信这一点。

m_houses.count(clientId)也会返回0

然而,当我将Get([...])函数内容更改为以下循环时,一切都像魅力一样,没有任何问题证明记录确实存在于地图中:

for (const auto& h : m_houses) {
     if (h.first == clientId) {
          return h.second;
     }
}

return nullptr;

这是我第一次遇到类似STL地图的问题。

有什么问题?我一直用这种方式找到记录,从未遇到过这样的问题。

修改

HouseTable_tHouse

struct HouseTable_t {
    char name[24 + 1];
    char owner[64 + 1];

    int clientId;
    int type;
    int rank;
    unsigned char identifier;
}

class House{
public:
    House() = default;

    HouseTable_t m_table;
    int id;
    int data;
};

1 个答案:

答案 0 :(得分:1)

此:

memcpy(&h, ...

应该是:

memcpy(h, ...

否则你会摧毁指针。