gpt4 book ai didi

c++ - 大小为 4 的迭代器无效读取

转载 作者:行者123 更新时间:2023-11-27 22:48:24 24 4
gpt4 key购买 nike

为什么 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 中可能存在问题,或者完全是其他问题?

最佳答案

for 循环中删除容器元素必须小心...

你必须做到:

map<uint16_t, SPacket *>::iterator it = m_PacketMap.begin()
while ( it != m_PacketMap.end() )
{
if (it->first < ackNumber)
{
if (it->second->data) delete [] it->second->data;
if (it->second) delete it->second;
// it updated by erase, no need to increment
it = m_PacketMap.erase(it);
}
else
{
// move to next item
++it;
}
}

这就是必须编写删除容器中某些元素的循环的方式(对于 set、vector... 也是如此)。

对于 map ,上面的代码仅适用于 C++11。如果您使用早期版本,请根据 this post (未经测试),你应该这样做:

for ( map<uint16_t, SPacket *>::iterator it = m_PacketMap.begin(); it != m_PacketMap.end();  ) 
{
if (it->first < ackNumber)
{
if (it->second->data) delete [] it->second->data;
if (it->second) delete it->second;
// it updated by erase, no need to increment
m_PacketMap.erase(it++);
}
else
{
// move to next item
++it;
}
}

因为删除项目然后递增它(你最终用你的 for 循环做的事情)会让你松散元素并可能传递 m_PacketMap.end() (然后让你的循环覆盖超出容器限制的项目)如果你从容器中删除最后一个元素。

关于c++ - 大小为 4 的迭代器无效读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40662944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com