我有定义为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
}
问题:在再现错误
bool operator<(const event& e) const
{
return id < e.id; <------- GIVES SEGMENTATION FAULT SOMETIMES
}
多次尝试后:有时候,(我的意思是说9月10日的时候,我可以运行完全相同的数据集的整个应用程序没有任何问题),我得到一个分段错误这里在调试的同时,我设法找出了该段的段错误。在这种情况下,e.id
填充了数据,id
表示:“没有这样的值”。
帮助? 谢谢
你考虑(是否有可能)是'mapOfEventsByString.find(ASTRING)'可能会失败(即返回'mapOfEventsByString.end()')?在这种情况下,其余的有未定义的行为。它可能会在' - >'(最好)甚至在下面的操作中崩溃。 – Scheff
不要说'typedef struct name {...} name'是C'ism。在C++中,不需要'typedef'。你可以只'结构名{...};'和'使用不name'和'struct'限定它就像你C. – NathanOliver
呀,你必须检查地图的返回值::发现在使用它之前。我怀疑你使用的是“typedef”,表示你来自C国,这可能就是为什么你试图把所有东西都压缩到一条线上的原因。我建议你用多行来做,例如
auto eventKey = mapOfEventsByString.find(aString); if (eventKey != mapOfEventsByString.end() {if (eventKey->second.count(event)==1) {//do stuff}}
或者,使用map :: get,把你的电话放在一个try块中,并捕获out_of_range。 – tipaye