使用GDB可以看到當std::istream_iterator
增加時發生錯誤。
#0 __GI_raise ([email protected]=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007ffff71d13fa in __GI_abort() at abort.c:89
#2 0x00007ffff7ae80ad in __gnu_cxx::__verbose_terminate_handler()() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x00007ffff7ae6066 in ??() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4 0x00007ffff7ae60b1 in std::terminate()() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5 0x00007ffff7ae62c9 in __cxa_throw() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6 0x00007ffff7b0eea3 in std::__throw_ios_failure(char const*)() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7 0x00007ffff7b4a82d in std::basic_ios<char, std::char_traits<char> >::clear(std::_Ios_Iostate)() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#8 0x00007ffff7b4d52f in std::istream::operator>>(int&)() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#9 0x00005555555556c2 in std::istream_iterator<int, char, std::char_traits<char>, long>::_M_read (this=0x7fffffffe230) at /usr/include/c++/6/bits/stream_iterator.h:121
#10 0x0000555555555ac2 in std::istream_iterator<int, char, std::char_traits<char>, long>::operator++ (this=0x7fffffffe230) at /usr/include/c++/6/bits/stream_iterator.h:95
#11 0x0000555555555a36 in std::__copy_move<false, false, std::input_iterator_tag>::__copy_m<std::istream_iterator<int, char, std::char_traits<char>, long>, std::back_insert_iterator<std::vector<int, std::allocator<int> > > > (__first=..., __last=..., __result=...) at /usr/include/c++/6/bits/stl_algobase.h:293
#12 0x0000555555555965 in std::__copy_move_a<false, std::istream_iterator<int, char, std::char_traits<char>, long>, std::back_insert_iterator<std::vector<int, std::allocator<int> > > > (__first=..., __last=..., __result=...) at /usr/include/c++/6/bits/stl_algobase.h:386
#13 0x00005555555557e2 in std::__copy_move_a2<false, std::istream_iterator<int, char, std::char_traits<char>, long>, std::back_insert_iterator<std::vector<int, std::allocator<int> > > > (__first=..., __last=..., __result=...) at /usr/include/c++/6/bits/stl_algobase.h:424
#14 0x00005555555554c9 in std::copy<std::istream_iterator<int, char, std::char_traits<char>, long>, std::back_insert_iterator<std::vector<int, std::allocator<int> > > > (__first=..., __last=..., __result=...) at /usr/include/c++/6/bits/stl_algobase.h:456
#15 0x00005555555550ed in test (is=..., exceptions=true) at sample.cpp:12
#16 0x000055555555521c in main() at sample.cpp:25
解開循環,你可以發現它是增量的最後一個電話引起該問題,即調用std::istream_iterator::operator++
當輸入流爲空。
仔細觀察堆棧跟蹤,當流爲空時,最後一個增量正在嘗試std :: istream :: operator >>。根據cppreference,由於操作無法從流中提取整數,因此會導致設置失敗位。
'basic_ios :: clear'是設置iostate的最低級別條目。其他函數通過調用'basic_ios :: clear'來設置failbit/badbit/eofbit。 – cpplearner
@carderarner:謝謝你的闡述。我仍然不知道爲什麼上面的代碼片段拋出任何異常。 – sv90