- ベストアンサー
C++のSTLのvector
C++のSTLのvectorのerase()で、落ちてしまいます。 vectorのサイズを確認したとところ、!=0です。 原因が何か知りたいので、考えられる原因を教えてください。 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
文脈が分からないとはっきりしたことは分かりませんが、最低限、下記の内容を教えてください。 ・vectorの要素の型は何でしょうか? ・アロケータはデフォルトですか? ・eraseに与えた引数は何でしょうか? ・どう落ちたのでしょうか? ・処理系(およびSTLの実装)は何でしょうか?
その他の回答 (3)
- jacta
- ベストアンサー率26% (845/3158)
> ・eraseに与えた引数は何でしょうか? > イテレータを与えました。 どんな素性の反復子を何個渡したのですか? > ・どう落ちたのでしょうか? > Msg(クラス)のデストラクタで落ちているみたいです。 デストラクタでどう落ちたのでしょうか? Msgクラスの定義が分からないので何ともいえませんが、既に解体済みのものを再度解体しようとした可能性が高いと思います。 他の方も指摘していますが、push_backやinsert等を行う前に取得した反復子を使っていませんか?
お礼
回答有難うございました。 勉強する時間がなかった為、vectorの(型がクラス)使用は、 諦めました。次回までに勉強しておきたいと思います。 結局、自分で、同様の処理を行う関数を作成しました。
- MrBan
- ベストアンサー率53% (331/615)
# コードを出された方が早そうですが、とりあえず考えられる可能性を。 ・STLを使っているコードがバグっている。 ・言語標準規格から逸脱している。 ありがちなのは不正なiteratorの利用でしょう。 なお、STLは操作によってiteratorが無効になる条件があります(詳細条件は言語規格を参照)。 これで無効化されたことに気付かないままiteratorを使うと「はまる」可能性もあります。 もしくは、マルチスレッドで排他制御なしに参照してるとか。 もっと単純なミスの可能性も十分に考えられると思います。
お礼
コードを載せれるような状態ではなかった為、 乗せることが出来ませんでした。 (かなりテンパっていました。) 回答有難うございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
プログラム見ないとわからんけど, std::vector<T>::erase() を使ってるんだったらその引数の iterator がおかしいってことは考えられる. iterator をとってから vector を変更すると前の iterator が使えなくなることがあるんだけど, それは大丈夫?
お礼
回答有難うございます。
補足
・vectorの要素の型は何でしょうか? 要素の型はMsg(クラス)です。 ・アロケータはデフォルトですか? デフォルトです。 ・eraseに与えた引数は何でしょうか? イテレータを与えました。 ・どう落ちたのでしょうか? Msg(クラス)のデストラクタで落ちているみたいです。 ・処理系(およびSTLの実装)は何でしょうか? Fedora core4です。 初心者で、上手く説明できなくてすみません。 宜しくお願い致します。