3

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

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

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

clientは、によってアクセス可能なプライベートメンバーを持つtr1::shared_ptrという名前のメンバーを持つオブジェクトを指すです。はのtypedefであり、のプライベートメンバーを返します。inventoryvector<itemPtr>getMisc()itemPtrtr1::shared_ptr<Item>getName()std::stringItem

基本的に、client->inventory.getMisc()要約するとstd::vector、イテレータを最初の要素に到達させようとしています。

問題は、4行目がsegfaultsであるということです。明らかに、それが指すイテレータまたはshared_ptrのいずれかが無効です。最初のcerrステートメントを使用して、ベクトル自体が有効かどうかをテストしました。正しく出力されるので、正しいと思います。

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

4

3 に答える 3

12

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

実際にを返す場合は、リストのコピーstd::vector<itemPtr>を返します。その場合、一時コピーは実行が終了するまで破棄されないため、最初のアクセスパターンは(ゆっくりと)機能します。実行が終了するまでに、それ自体が一時コピーにコピーされます。2つ目は、でイテレータに到達した後、一時的なものがスコープから外れて破棄され、作成されたばかりのイテレータがハングしたままになるため、失敗します。frontitemPtrbegin

于 2010-07-09T17:36:25.797 に答える
1

これをデバッグするために皆さんは何をしますか?

front()コードをステップスルーして、何が返されるか、何が返されるかについて何が違うかを確認し(*it)ます。

于 2010-07-09T17:35:29.373 に答える
0

ベクトルが空ではないことを確認しますか?との動作がわずかに異なり、偶然に機能する可能性がありますが、イテレータ自体の追加チェックにより、使用時にセグメンテーション違反が発生する可能性がありますfrontbeginfront

于 2010-07-09T17:37:38.270 に答える