-5

申し訳ありませんが、コード bc を提供できません。持っていません。

私の同僚 (会社に長い間いるが、彼が何をしているのか知らないようだ) は、ベクターから要素を削除するために奇妙なことをしなければならないと主張しています。彼はすべての要素をある位置に移動し (削除したい要素から開始)、ベクトルの最後の要素を削除します。これは問題ないように思えますが、非常に非効率的です。標準ライブラリの std::vector::erase() は、これをうまく処理できるはずです。

彼がこれを行うのは、要素 0 で消去を呼び出すとランダムな例外が発生すると主張しているからです。

私の質問は、これを引き起こす原因は何ですか? これはスレッドセーフの問題であると確信していますが、それを引き起こす可能性のあるものは他にありますか?

教えてください...私はC++が初めてです。

繰り返しますが、コードを提供できなくて申し訳ありません。

ありがとう、ジブ

4

4 に答える 4

5

...要素0で消去を呼び出すと、ランダムな例外が発生します。

いいえ、そうではありません。

彼が実際に何をしているかについて多くの情報がなくても、期待できる答えはそれだけです。

于 2010-09-24T17:26:06.453 に答える
2

要素 0の呼び出しが例外をスローする唯一の場所はerase、未定義の動作が既に呼び出されている場合です。最も一般的なのは、空のベクターから要素ゼロを消去しようとすることです。

これは問題ないように思えますが、非常に非効率的です。

そうではありません-eraseとにかくそれがやっていることです。しかし、標準ライブラリが既に行っていることを再実装しても意味がありません。

于 2010-09-24T17:26:26.673 に答える
1

コードなしで言うのは難しいです。> 0 の場合vector::size()、要素 0 の消去は完全に有効です。彼はイテレータを使用して 0 番目の要素を消去している可能性があり、イテレータは何らかの形で無効になっています。

于 2010-09-24T17:26:28.347 に答える
0

同僚の論理に関するあなたの説明に基づいて、あなたの評価は正確だと思います。「ランダムな例外」 = 「ベクター コンテナーの誤用による未診断のバグ」。

とはいえ、この質問は少し無意味です。ソースを提供できない場合、何が問題なのか、それともそうでないのかについて、どうすれば決定的な答えを得ることができますか?

于 2010-09-24T17:27:39.263 に答える