で時折セグメンテーションフォールト私は次のように定義された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;
を
if(mapOfEventsByString.find(aString)->second.count(event)==1)
{
//do stuff
}
:Event
は、私はこのコード行を使用して指定された文字列に関連付けられています問題:エラーの再現に多くの試みの後
bool operator<(const event& e) const
{
return id < e.id; <------- GIVES SEGMENTATION FAULT SOMETIMES
}
:時々(と私は9/10回私は何の問題もなく、まったく同じデータセットを持つアプリケーション全体を実行できることを意味)が、私はここでセグメンテーションフォールトを取得しますデバッグ中に、私はsegfaultをその行に突き止めることができました。そのシナリオではe.id
はデータで満たされ、id
は「そのような値はありません」と言います。
ヘルプ? ありがとうございます
'mapOfEventsByString.find(aString)'が失敗する(つまり、 'mapOfEventsByString.end()'を返す)ことが考えられましたか?この場合、残りは未定義の動作をします。 ' - >'(せいぜい)、または以下の操作でもクラッシュする可能性があります。 – Scheff
'typedef struct name {...} name;'はC'ismではありません。 C++では、 'typedef'の必要はありません。 'struct name {...};'を 'struct'で修飾することなく' name'を使うことができます。 – NathanOliver
ええ、map :: findの戻り値をチェックする必要があります。私はあなたがC土地から来ているという「typedef」を使用していると考えています。これが、すべてをその1行に絞ろうとした理由かもしれません。私はそれを複数の行で行うことをお勧めします。
auto eventKey = mapOfEventsByString.find(aString); if (eventKey != mapOfEventsByString.end() {if (eventKey->second.count(event)==1) {//do stuff}}
また、map :: getを使用して、tryブロックに呼び出しを置き、out_of_rangeをキャッチします。 – tipaye