2014-09-10 90 views
3

在Visual C++ 2010 Express下編寫代碼時發現問題。當執行最後一行時,我得到一個運行時錯誤「vector iterator not derefereenable」。下面的代碼有什麼問題?在Visual C++ 2010 Express下無法使用迭代器擦除(迭代器優先,迭代器最後)

vector<int> vec (5, 1001); 

vector<int>::iterator begin = vec.begin(); 
vector<int>::iterator end = vec.begin(); 

begin++; //std::advance(begin, 1); gives the same result 
end++; end++; end++; //std::advance(end, 3); gives the same result 

cout << (*begin) << endl; 
cout << (*end) << endl; 
begin = vec.erase(begin, end); 
cout << (*begin) << endl;    //It doesn't work 

此代碼在gcc下工作。 當元素逐個被刪除時,它也可以在VC++ 2010 Express中運行。

這是VC++ 2010 Express中的錯誤嗎?

+1

VC++ 2013沒有問題 – Matt 2014-09-10 12:57:00

+0

看起來像。可能性是'vec.erase(a,b)'返回'a',因爲沒有調試檢查,即使技術上'a'失效(因爲它現在指的是不同的元素)也是可行的。我會看看源代碼,看看是否發生了什麼(可能通過逐步完成)。 – Yakk 2014-09-10 13:09:40

+1

VC++ 2010 Professional也沒有問題。版本=「Microsoft(R)32位C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86」。編譯並使用「cl test.cpp」從命令行運行。 – 2014-09-10 13:13:54

回答

3

如果您沒有使用SP1,那麼此VC10 bug 可能已經擊中了您,那裏還列出了某種解決方法。

+0

我確認它在以下情況下工作:1.使用不帶SP1的發行版配置進行編譯。 2.它也適用於SP1的調試配置。案件解決了。 – ThomasN 2014-09-11 06:50:30

+0

「如果您經常發現自己懷疑編譯器或硬件出錯,您仍然處於迷信領域,只有大約5%的錯誤是硬件,編譯器或操作系統錯誤」,Code Complete書。這次你幸運了... – 2014-09-12 18:51:49