【发布时间】: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_t 和House:
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;
};
【问题讨论】:
-
House和HouseTable_t的定义是什么,为什么memcpy指向指针? -
@user657267 对于这种特殊情况并不重要,但正如您从函数名中看到的那样,它是通过数据包发送的,我正在这样检索它。
-
使用
memcpy,您正在泄漏内存并丢失您在上一行中分配的House对象。 -
它真的很重要,因为它没有意义,你创建一个新的
House,然后在下一行你覆盖指针值。你为什么还要在 C++ 中使用memcpy? -
由于您在每个
OnReceiveHousePacket的开头清除m_houses,我想说问题是您收到一个空包。
标签: c++ dictionary stl