结构运算符函数重载中的偶然分段错误

时间:2017-04-21 11:16:25

标签: c++ segmentation-fault operator-overloading structure

我的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说:“没有这样的价值”。

帮助? 谢谢

1 个答案:

答案 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()时设置断点,并调查为什么查找失败。祝你好运!