【发布时间】:2016-11-17 18:58:48
【问题描述】:
为什么 Valgrind 会在下面的行中指明 Invalid read of size 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 中可能存在的问题,或者完全是其他问题?
【问题讨论】:
-
是的。如果它们与键匹配,我将删除地图条目。我会将正文添加到原始问题中。啊。我想我明白你在说什么。容器收缩时迭代器如何工作。
标签: c++ dictionary iterator valgrind