4

そのため、オブジェクトが 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.find でコア ダンプを取得しています。おそらく、アイテムがマップにない場合、 map::end と同等のイテレータを返すことになっています

ここで何が起こっているのですか?

GCC: 3.4.6

4

10 に答える 10

4

多くの理由でクラッシュする可能性があります。少なくともTheObjectのコンストラクターの定義を知らなくても、問題を推測することはほとんど残っていると思います。これまでのところ、コードは問題ないように見えますが、単純化できます。

char symbolName[] = "Hello";
map<string,TheObject> theMap;
theMap.insert(make_pair(symbolName, TheObject(symbolName)));

シンボルが既にマップされている場合は何もせず、新しい TheObject オブジェクトを破棄します。

于 2009-01-26T20:52:44.490 に答える
4

なぜこのようにしないのですか?

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!
于 2009-01-26T20:14:50.620 に答える
3

find() を実行する前に、STL マップが empty() かどうかを確認してください。一部の STL 実装は、空の STL マップで find() を実行するとバグがあります。

于 2009-01-26T20:09:56.030 に答える
2

実際のコードを投稿するか、少なくともあなたが説明している動作を示す完全な例を投稿してください。このようなフォーラムに投稿するためだけに書かれたごっこ遊びのコードをデバッグしようとすると、翻訳で微妙な問題が失われることがあります。

于 2009-01-26T20:37:45.940 に答える
2

ところで、単純化には 2 つの方法があります。

まず、コンストラクターを使用するmake_pair代わりに使用します。pairつまり、型引数を明示的に指定する必要はありません。

theMap.insert(make_pair(symbolName, theObject));

次に、コードの代わりに次のように単純に記述できます。

theMap[symbolName] = theObject;
于 2009-01-26T20:16:09.853 に答える
1

コードの簡素化に加えて:

char[] の代わりに std::string を使用し、TheObject のクラス定義内でも使用します。

TheObject クラスが char 配列で何をしているのかわかりませんが、この関数の範囲外でマップを使用する場合、たとえば. それを戻り値として使用することで、もう定義されていない symbolName のアドレスを指すオブジェクトがどこかにあるはずです。

于 2009-01-26T22:10:45.690 に答える
1

このコードは正常に動作するはずです。

考えられる唯一の問題は TheObject 実装内にありますが、find 呼び出しには影響しません。

また、その前に実行されたコードによるバッファ オーバーフローなど、無関係な問題である可能性もあります。

于 2009-01-26T20:09:01.350 に答える
0

コンストラクタで使用しているかどうかを確認してください。コンストラクター内でマップを使用すると、同様の問題が発生しました。

于 2009-05-06T21:06:19.980 に答える
0

マップオブジェクトへのポインターを使用して、このような問題を修正しました。コンストラクターで使用されるため、それらはポインターである必要があり、コンストラクター内でそれらを新しくしました。

于 2009-05-06T21:20:00.180 に答える
0

なぜコア ダンプが発生するのかわかりません。コードは私のために働きます。

コードをよりシンプルで読みやすくする機会があります。

  • 他の誰かが指摘したように、挿入を単純化できますtheMap[symbolName] = TheObject(symbolName)

  • 私が間違っているかもしれませんが、私が知る限り、 { 'a', 'b', '\0' } は "abc" と同じchar symbolName[] = "Hello";なので、次のように単純化できます。ここに何人かの人々。

于 2009-01-26T20:56:23.157 に答える