爲什麼Valgrind會在以下行中指示Invalid read of size 4
?迭代器大小爲4的無效讀取
for (map<uint16_t, SPacket *>::iterator it = m_PacketMap.begin() ; it != m_PacketMap.end(); ++it)
{
if (it->first < ackNumber)
{
if (it->second->data) delete [] it->second->data;
if (it->second) delete it->second;
m_PacketMap.erase(it);
}
}
我覈實循環之前m_PacketMap.size() > 0
並臨時添加調試循環之前驗證m_PacketMap內容,但是這一切看起來正常。這是Valgrind的錯誤信息和RadioManager.cpp:1042線以上:
==5535== Invalid read of size 4
==5535== at 0x421EBE5: std::_Rb_tree_increment(std::_Rb_tree_node_base*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==5535== by 0x80AD20D: RadioManager::DecodeAcknowledgementNumber(unsigned char*, unsigned int) (RadioManager.cpp:1042)
這是怎麼SPacket和m_PacketMap定義
typedef struct SPacket
{
uint8_t * data;
size_t size;
timeval tval;
} SPacket;
map<uint16_t, SPacket *> m_PacketMap;
是否有一個問題,我的迭代器,一個可能的問題在_Rb_tree_increment中,還是其他的東西?從for
循環
是的。如果他們匹配密鑰,我正在清除地圖條目。我將添加正文到原始問題。啊。我想我明白你在做什麼。當容器縮小時,迭代器如何工作? – jacknad