12

このコードを確認してください:

#include "stdafx.h"
#include <list>

int _tmain(int argc, _TCHAR* argv[])
{
    std::list<int> mylist;
    mylist.push_back(1);
    std::list<int>::iterator i = mylist.end();
    if( i == mylist.end() )
        printf( "end is end\n" );

    mylist.clear();
    if( i == mylist.end() )
        printf( "never get here because Microsoft seems to "
                "think the iterator is no longer safe.\n" );

    return 0;
}

現在、cplusplus.comによると、これは問題にはならないはずです。リリース モードでは、これで問題はなく、実際には問題は発生しないと思いますが、続行せずに保釈されるため、デバッグが不可能になります。ポインタはありますか?

4

3 に答える 3

13

他の回答は、一般に、コンテナーがクリアされたときにコンテナーの終了後のイテレーターが有効であることに依存することはできないことを指摘しています。ただし、リストの過去のイテレータは実際に有効なままである必要があります。

C ++ 11 23.3.5.4/3効果:イテレータと消去された要素への参照のみを無効にします。

past-the-endイテレータはどの要素も参照しないため、無効にしないでください。

于 2013-02-01T13:37:39.433 に答える
4

C++11 から、表 100 (シーケンス コンテナーの要件):

clear()[...] は、末尾イテレータを無効にする可能性があります。

std::listもちろん、シーケンス コンテナー テンプレート (23.3.5.1/2) です。

リストは、コンテナー、リバーシブル コンテナー (23.2 の 2 つの表に記載)、オプションのシーケンス コンテナー要件 (23.2.3) のほとんどを含むシーケンス コンテナー、およびアロケーター対応コンテナーのすべての要件を満たします。 (表 99)。例外は、提供されていない operator[] および at メンバー関数です。ここでは、これらの表のいずれにも記載されていないリストの操作、または追加のセマンティック情報がある操作についてのみ説明します。

于 2013-02-01T13:20:30.467 に答える
-2

これは実際には無効です。イテレータは、現在の状態コンテナーでのみ有効です。項目を追加または削除すると、反復子は無効になります。

あなたがリンクしている記事は、あなたがしていることは有効であるとは言いません。クリア後​​に新しいイテレータを取得します。

リリース コードに表示されない理由は、問題を検出するデバッグが無効になっているためです。

于 2013-02-01T13:13:30.673 に答える