【问题标题】:STL map find doesn't work properly [closed]STL 地图查找无法正常工作 [关闭]
【发布时间】:2016-04-27 03:55:42
【问题描述】:

我有一张包含 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;
};

【问题讨论】:

  • HouseHouseTable_t 的定义是什么,为什么memcpy指向指针?
  • @user657267 对于这种特殊情况并不重要,但正如您从函数名中看到的那样,它是通过数据包发送的,我正在这样检索它。
  • 使用memcpy,您正在泄漏内存并丢失您在上一行中分配的House 对象。
  • 真的很重要,因为它没有意义,你创建一个新的House,然后在下一行你覆盖指针值。你为什么还要在 C++ 中使用memcpy
  • 由于您在每个OnReceiveHousePacket 的开头清除m_houses,我想说问题是您收到一个空包。

标签: c++ dictionary stl


【解决方案1】:

这个:

memcpy(&h, ...

应该是:

memcpy(h, ...

否则你将丢弃指针。

【讨论】:

  • 这会调用未定义的行为,这会破坏正在插入的键的值...
  • 收到错误然后cannot convert 'HouseTable_t' to 'void*' for argument '1' to 'void* memcpy(void*, const void*, size_t)'
  • @Lucas:这段代码没有产生那个错误。也许这段代码是:memcpy(h-&gt;table, ... -- 请不要提供假代码。
  • @BenjaminLindley 对不起。我一直在努力提供尽可能多的信息,并在发布过程中犯了一些错误。
  • @Lucas:这就是复制/粘贴的用途。
猜你喜欢
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多