我的C ++结构定义如下:
typedef struct event{
int id;
string name;
//int arg0;
QByteArray data;
bool operator<(const event& e) const
{
return id < e.id;
}
bool operator==(const event& e) const
{
return id == e.id;
}
}Event;
我还有一个如下定义的地图:
map<string, set<Event>> mapOfEventsByString;
当我想查看Event
是否与给定字符串相关联时,我使用以下代码行:
if(mapOfEventsByString.find(aString)->second.count(event)==1)
{
//do stuff
}
问题:有时候(我的意思是9/10次我可以使用完全相同的数据集运行整个应用程序而没有任何问题),我在这里得到了一个分段错误:
bool operator<(const event& e) const
{
return id < e.id; <------- GIVES SEGMENTATION FAULT SOMETIMES
}
在调试时多次尝试重现错误后,我设法将段错误指向该行。在这种情况下,e.id
填充了数据,id
说:“没有这样的价值”。
帮助? 谢谢
答案 0 :(得分:0)
如果没有回溯,我们只会猜测,但这强烈表明会员id
不存在,因此您无法访问不应该存储的内存。
如果成员id
不存在,那么您的operator<
来电就会中断。鉴于它是由代码的以下突出显示部分调用的:
if(mapOfEventsByString.find(aString)->second.count(event)==1)
// ^^^^^^^^^^^^^
向我建议下面突出显示的表达式不能确定地引用有效对象:
if(mapOfEventsByString.find(aString)->second.count(event)==1)
// ^^^^^^
唯一可能发生的方法是,如果以下突出显示的取消引用操作无效:
if(mapOfEventsByString.find(aString)->second.count(event)==1)
// ^^
当find
失败,返回mapOfEventsByString.end()
(无法解除引用)时发生:
if(mapOfEventsByString.find(aString)->second.count(event)==1)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我认为如果你确实检查了成功,你会看到,10次中有1次,aString
中找不到mapOfEventsByString
。
让我们这样做,而不是:
const auto it = mapOfEventsByString.find(aString);
if (it != mapOfEventsByString.end() && it->second.count(event) == 1) {
// do stuff
}
现在,您可以在it == mapOfEventsByString.end()
时设置断点,并调查为什么查找失败。祝你好运!