2017-04-21 30 views
1

で時折セグメンテーションフォールト私は次のように定義された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は「そのような値はありません」と言います。

ヘルプ? ありがとうございます

+2

'mapOfEventsByString.find(aString)'が失敗する(つまり、 'mapOfEventsByString.end()'を返す)ことが考えられましたか?この場合、残りは未定義の動作をします。 ' - >'(せいぜい)、または以下の操作でもクラッシュする可能性があります。 – Scheff

+2

'typedef struct name {...} name;'はC'ismではありません。 C++では、 'typedef'の必要はありません。 'struct name {...};'を 'struct'で修飾することなく' name'を使うことができます。 – NathanOliver

+1

ええ、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

答えて

0

私たちは推測していますが、これはメンバーidが存在しないことを強く示しています。

メンバーidが存在しない場合は、operator<コールが壊れています。それはあなたのコードの以下の強調表示部分によって呼び出されることを考える:

if(mapOfEventsByString.find(aString)->second.count(event)==1) 
//           ^^^^^^^^^^^^^ 

以下確実に有効なオブジェクトを参照していない表現強調表示することを私に示唆している:

if(mapOfEventsByString.find(aString)->second.count(event)==1) 
//         ^^^^^^ 

唯一の方法をその

findが失敗したときに発生する
if(mapOfEventsByString.find(aString)->second.count(event)==1) 
//         ^^ 

は、mapOfEventsByString.end()を返す:以下の強調表示参照解除操作が無効である場合に発生する可能性があります(これは間接参照することはできません):あなたが実際にあなたがそれを見ることができます成功を見つけるためにチェックすると、私は思う

if(mapOfEventsByString.find(aString)->second.count(event)==1) 
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

、10回のうち1、aStringmapOfEventsByStringに見つかりませんでした。

代わりに、はこのやろう:

const auto it = mapOfEventsByString.find(aString); 
if (it != mapOfEventsByString.end() && it->second.count(event) == 1) { 
    // do stuff 
} 

今、あなたはときit == mapOfEventsByString.end()のためにブレークポイントを入れて検索が失敗した理由をを調べることができます。がんばろう!

関連する問題