1. ホーム
  2. c++

[解決済み] リスト・イテレータは再参照できない?

2022-01-30 10:45:33

質問

以下のコードを使用すると、"list iterator not dereferencable"というエラーが表示されます。

bool done = false;
while (!_list_of_messages.empty() && !done) {
    // request the next message to create a frame
    // DEBUG ERROR WHEN NEXT LINE IS EXECUTED:
    Counted_message_reader reader = *(_list_of_messages.begin());
    if (reader.has_more_data()) {
        _list_of_frames.push_back(new Dlp_data_frame(reader, _send_compressed_frames));
        done = true;
    } else {
        _list_of_messages.pop_front();
    }
}

("Counted_message_reader..." で始まる行が問題を起こす行です)

このエラーは常に発生するわけではなく、不定期に発生するようです(通常はバッファリングされたデータがたくさんあるとき)ので注意してください。

_list_of_messages は以下のように宣言されています。

std::list<Counted_message_reader> _list_of_messages;

周囲のコードでは、次のようになります。 pop_front , push_frontsize , empty または end をチェックします。 _list_of_messages を使用することはできませんが erase を呼び出します。

STLのドキュメントを勉強しましたが、目立った問題は見当たりません。上記のコードに何か問題があるのでしょうか、それともどこかでメモリーリークしているのでしょうか?

ありがとうございます。Appreciated!

解決方法は?

レースコンディションの可能性は?

もしリストが空だったら、begin()を参照解除しようとしたときに問題が発生すると思いますが、空かどうかをチェックしているのですね。 別のスレッドが並行してリストのアイテムを追加または削除していませんか?

あなたのコードスニペットは、VS 2008で動作します(私がtypedef Counted_message_reader から int ).