0

次のようなコードを取得しました。

for (set<GROUP*>::iterator i = Data.m_Resulting.begin(); i != Data.m_Resulting.end();)
{
    printf("Deleting %d\n", (*i)->nId);
    Data.m_MpptPool.erase(i++);
}

printf("Remains in pool: %d\n", Data.m_MpptPool.size());

// Dump Pool:

for (set<GROUP*>::iterator i = Data.m_MpptPool.begin(); i != Data.m_MpptPool.end(); i++)
{
    printf("\t %d\n", (*i)->nId);
}

削除する前に set に 2 つのオブジェクトがあり、最初のループがそれらの 1 つを削除すると、.size() 関数は正しい数を示します (1) ただし、セットの内容を出力する 2 番目の for ループは、両方の要素をそこの。後でこの要素を参照すると、セグメンテーション違反が発生します。ここで何が問題になる可能性がありますか?

4

2 に答える 2

4

std::setある( ) のイテレータm_Resultingを別のstd::set( ) で使用することはできませんm_MpptPool。これは未定義の動作です。次の値を使用する必要があります。

Data.m_MpptPool.erase(*it++);
于 2013-09-16T19:16:36.480 に答える
3

最初のサイクルは を繰り返しますがData.m_Resulting、 内の要素を削除しData.m_MpptPoolます。前者を指す反復子を使用して、後者の要素を削除します。それは違法であり、率直に言って、まったく意味がありません。コードの動作は未定義です。どのように機能することを期待していましたか? どういう意味ですか

Data.m_MpptPool.erase(i++);

イテレータiが実際に指したときData.m_Resulting?

于 2013-09-16T19:16:44.347 に答える