2011-07-12 5 views
1
#include<list> 
#include<iostream> 

using namespace std; 

list<int> DL,TRS; 
list<int>::iterator gitr; 

void exchange(); 

int main() { 
    DL.push_back(10); 
    gitr=DL.begin(); 
    TRS.push_back(11); 
    TRS.push_back(12); 
    exchange(); 
    cout<<(*gitr)<<endl; 
} 

void exchange() { 
    list<int> tdl; 
    tdl=DL; 
    DL.clear(); 
    DL=TRS; 
    list<int>::iterator tmpitr=DL.begin(); 
    for(;tmpitr!=DL.end();++tmpitr) 
    cout<<(*tmpitr)<<endl; 
    DL.clear(); 
    DL=tdl; 
} 

これは10の代わりに11を出力します。なぜですか?グローバルイテレータをリストにリセットする

+3

なぜ10を出力すると思いますか? –

+0

あなたのコードを再フォーマットしましたが、空白はあなたの友人であることに注意してください。 –

+0

しかし、あなたはコードの後に​​質問を削除しました。 – crashmstr

答えて

2

このプログラムは未定義の動作を呼び出し、したがって、それは望んでいる何かをするために許可されている - ?でも、11の代わりに、10

なぜそれがUBでの印刷gitrにはDL.begin()が割り当てられているため、exchangeの内部でDLがクリアされ、gitrが無効なイテレータになります。イテレータを参照解除するのはUBです。

関連する問題