3


0

vector :: frontの参照は機能しますが、vector :: beginは機能しません

私はこのコードを持っています:

cerr << client->inventory.getMisc().front()->getName() << endl;
vector::iterator it;
it = client->inventory.getMisc().begin();
cerr << (*it)->getName() << endl;

それについて少し説明させてください。

「client」は「tr1

shared_ptr」であり、「getMisc()」でアクセスできるプライベートな「vector」メンバーを持つ「inventory」という名前のメンバーを持つオブジェクトを指します。 「itemPtr」は「tr1 :: shared_ptr」のtypedefであり、「getName()」は「Item」のプライベートな「std :: string」メンバーを返します。

基本的に、 `client→ inventory.getMisc()`は `std

vector`に要約され、最初の要素へのイテレーターを取得しようとしています。

問題は、4行目のセグメンテーション違反です。 どうやらイテレータまたはそれが指すshared_ptrのいずれかが無効です。 最初のcerrステートメントを使用して、ベクター自体が有効であるかどうかをテストしました。それが正しく印刷されるので、そうだと思います。

私が間違っていることはありますか? あるいは、これをデバッグするために何をしますか?

3 Answer


12


「getMisc」の署名とは正確には何ですか?

実際に `std

vector`を返している場合、リストの_copy_を返しています。 その場合、最初のアクセスパターンは(ゆっくり)動作します。これは、一時コピーが front`の実行が完了するまで破棄されず、その時点で itemPtr`が一時にコピーされるためです。 2番目は、「begin」でイテレータに到達した後、一時オブジェクトがスコープから外れて破棄され、作成したイテレータがハングしたままになるため、失敗します。


1


_ これをデバッグするにはどうしますか? _

コードをステップ実行して、 `front()`が返すものと `(* it)`が返すものの違いを確認します。


0


ベクトルが空でないことを確認しますか? 「front」と「begin」の動作がわずかに異なり、「front」が偶然に動作する可能性がありますが、イテレータ自体の追加チェックにより、使用時にセグ障害が発生します。