On 1 May 2013 17:45, Mihai Vasilian wrote: > Hi, > I have a question related to iterators of a swapped list. > > #include <list> > #include <stdio.h> > int main() > { > int t[2]={-1,-2}; > std::list<int> l1(t, t+2), l2; > std::list<int>::iterator beg=l1.begin(), end=l1.end(); > l1.swap(l2); > for(; beg!=end; ++beg) > printf("\n%d", *beg); > return 0; > } > > $ gcc --version > gcc (GCC) 4.8.0 20130411 (prerelease) > > The program's output is: > -1 > -2 > 4195008 > -1 > -2 > 4195008 > -1 > -2 > 4195008 > and it doesn't stop. > > I also tested GCC 4.7.3 with the same output. > Am I doing it wrong ? Yes. The standard says: "The expression a.swap(b), for containers a and b of a standard container type other than array, shall exchange the values of a and b [...] Every iterator referring to an element in one container before the swap shall refer to the same element in the other container after the swap. It is unspecified whether an iterator with value a.end() before the swap will have value b.end() after the swap." For GCC's std::list the past-the-end iterators are not swapped, so after the swap `beg' refers to the beginning of `l2' and `end' refers past-the-end of `l1', so your loop compares iterators into different containers, which is undefined behaviour. You can verify this with GCC's debug mode, compile with -D_GLIBCXX_DEBUG. The program will fail when `beg' is incremented past the end, because the condition beg!=end is never true.