我的地图中包含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;
};
答案 0 :(得分:1)
此:
memcpy(&h, ...
应该是:
memcpy(h, ...
否则你会摧毁指针。