質問

そこで、こうした状況で必要とする場合にはオブジェクトが私のstl。っているのだが、私を追加します。

char symbolName[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
map<string,TheObject> theMap;
if (theMap.find(symbolName)==theMap.end()) {
            TheObject theObject(symbolName);
            theMap.insert(pair<string, TheObject>(symbolName,
                    theObject));
}

私がコアダンプの:theMap.見つけたら、オブジェクトがあまりテストされていません。はずの商品をご購入の場合は図である反復子を返しequivelentを地図:

う。

GCC:3.4.6

役に立ちましたか?

解決

これは、多くの理由のためにクラッシュすることができます。少なくともTheObjectのコンストラクタの定義を知らなくても、私たちは、主に、問題を推測するために残されていると思います。これまでのところ、あなたのコードは正常に見えるが、それは簡単にすることができます:

char symbolName[] = "Hello";
map<string,TheObject> theMap;
theMap.insert(make_pair(symbolName, TheObject(symbolName)));
シンボルがすでにマップされている場合は、

これは、新しいTheObjectオブジェクトを破棄、何もしません。

他のヒント

ただ、このようにそれをしないのはなぜ?

char symbolName[] = "hello";
theMap.insert(pair<string, TheObject>(symbolName, TheObject(symbolName)));

あなたのマップがある場合map<string, TheObject>あなたはNULLを検索しようとした場合、あなたはコア・ダンプを取得します。

// This will core dump:
char *symbolName = NULL; // Oops!
theMap.find(symbolName); // Kabang!

()検索を実行する前に()あなたのSTLのmapが空であるかどうかを確認してください。空STLマップ上で見つける()を実行するときに、いくつかのSTL実装はバギーである。

ところで、2つの可能性のある単純化があります。

まず、make_pairコンストラクタを使用する代わりにpair使用。これは、明示的に型引数を指定する必要がないことを意味します:

theMap.insert(make_pair(symbolName, theObject));
代わりにあなたのコードの

第二に、あなたは、単に書くことができます:

theMap[symbolName] = theObject;

あなたの実際のコード、またはあなたが記述している挙動を示す少なくとも完全な例を投稿してください。時々、問題はあなただけで、このようなフォーラムに投稿するには書かれてメイクと信じていたコードをデバッグしようとすると、翻訳で失わ繊細です。

このコードは正常に動作する必要があります。

唯一の可能な問題はTheObject実装の内部にあるが、それは、findコールに影響を与えるべきではありません。

また、原因前に実行されるいくつかのコードにバッファオーバーフローのように、いくつかの無関係な問題であることができますこれます。

コードの単純化に加えとして

[]ではなくCHARのはstd ::文字列を使用して、あまりにもTheObjectのためのあなたのクラス定義の中にそれを使用します。

あなたのTheObjectクラスはchar型の配列/ wをやっているかわからないが、あなたは、この関数の範囲外のマップを使用する場合、例えば。戻り値として、それを使用することによって、私はもう定義されていないにSymbolNameのアドレス、を指しているオブジェクトがどこかに存在している賭けます。

なぜだかよくわかりませんで頂くにコアダンプ;このコードの作品だった。

あう機会がコードがより簡単に、読みやすくするために:

  • どうすべきで簡単に挿入 theMap[symbolName] = TheObject(symbolName)

  • ことがございました間違いがってください{'a','b','\0'}と同じ"abc"でも簡単に char symbolName[] = "Hello"; っているという印象を持っている非慣用句の定義は分かりにく人もいます。

あなたは、コンストラクタでそれを使用しているかどうかを確認してください。コンストラクタの内部マップを使用しているとき、私は同様の問題があった。

私は自分のマップオブジェクトへのポインタを使用することによって、このような私の問題を修正しました。コンストラクタで使用されているので、彼らはポインタであることを必要として、コンストラクタ内で、私はそれらをnew'edます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top