6

私は初心者であり、インターネットで適切な答えを見つけることができなかったので、ヒントを求めたい. 次のエラーが表示されます: debug assertion failed - map/set iterator not dereferencable at the line at the line:

pointA = active->pointNext(timeNext);

関数pointNext()を使用すると、すべてが問題ないことがわかり、activeに関係するものは次のとおりです。

active = setS.data.end();

いくつかの詳細情報:

activemultiset< classA, classB::classC >::const_iterator です

setSにはsetS.Q、setS.W、setS.TおよびsetS.dataがあり、setS.dataには角括弧内の 0 が含まれています。.cpp ファイルにマルチセット イテレータ宣言がある場合、デバッグ中にアクティブな内容を確認するために入ることができません。.h ファイルにある場合は確認できます。

.cpp に入ることができないので、ポインタ (イテレータ) が内部で間違っているため、逆参照できないように想像できます空の場合、つまりsetS.dataが空の場合はどうなりますか? または中にゴミがある場合は?

以前は Linux で実行していたことは知っていますが、Windows で実行するために変更しなければならない機能はありますか? たとえば、多数のテンプレート パラメータを 1 つだけに変更するには? (setS.dataactiveに適切に帰属させるには、よくわからないため、適切に行いますか?

このやや混沌とした投稿で申し訳ありませんが、誰かが間違っている場合は無視するように私の推測を追加したかった. ここに何か不明な点や情報が不足している場合は、喜んで追加します。dereferencablility エラーが発生する理由と、どこを探すべきか教えてください。立ち往生していて、先に進む方法がわからないためです。

どんな助けでも大歓迎です、ありがとう!

4

5 に答える 5

11

簡単に言うと、activeはコンテナの を指しているため、end()逆参照することはできません。

以前はLinuxで実行されていたことを知っています

コードがまさにこのようなもので、「実行中」だった場合、これはすべて、ユーザーが気付いたような形でエラーが発生していないことを意味します。

于 2012-11-21T15:37:51.460 に答える
3

これはあなたの問題です:

active = setS.data.end();

これは、イテレータをコンテナの最後を通過したイテレータに戻します。
したがって、それが指しているアイテムは有効ではありません。イテレータが参照しているオブジェクトでもメソッドを呼び出すことはできません。

実行した場合:

active = setS.data.end();
if (setS.data.begin() != active)
{
    // make sure the set is not empty first
    --active;
    active->methodCall(); // This would be OK
}
于 2012-11-21T15:39:28.200 に答える
1

end()標準ライブラリの関数によって返されたイテレータは、「最後の要素の 1 つ後ろ」であるため、デリデレンスすることはできません。通常、有効な範囲を反復処理します。つまり、到達する前にend()停止します。

for(someIteratorType it = setS.data.begin(); it != setS.data.end(); ++it)
{
  it->someMethod();
}

または、C++11 では、

for (const auto& elem : setS.data)
{
  elem.someMethod();
}
于 2012-11-21T15:38:01.147 に答える
0

end() は、最後の要素の後の要素を指します。したがって、 end() は逆参照できません。

最後に到達したかどうかを確認するチェックを追加する必要があります。終了している場合は、逆参照しないでください。

于 2012-11-21T15:38:07.577 に答える
0
pointA = active->pointNext(timeNext);

operator->(...) を呼び出すには、"active" を逆参照する必要がありますが、active は setS.data.end() と同じです。

end() は、コンテナの終了の要素へのイテレータを返します。したがって、逆参照することはできません。

于 2012-11-21T15:39:34.620 に答える