なぜ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さ:
==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;
を定義する方法である:1042は、ライン上にあります_Rb_tree_increment、または完全に他の何かで?あなたがしなければならない
はい。それらがキーと一致する場合、私はマップエントリを消去しています。私は元の質問に本文を追加します。ああ私はあなたが何を得ているかを見ていると思う。コンテナが縮小しているときのイテレータの動作 – jacknad