2016-11-21 135 views
0

在Visual Studio 2013中,我創建了一個std :: vector並在其中存儲了一些字符串。然後,我想在vector中創建一些字符串的副本,並將它們追加到最後(假設在insert將擦除後將它們移動到最後),但是使用insert方法,我只在末尾看到空字符串,非常奇怪。我用一些簡單的測試代碼重現它,std :: vector <std::string>插入空字符串代替

std::vector<std::string> v; 
std::string s = "0"; 
for (int i = 0; i < 7; ++i) 
{ 
    s[0] = '0' + i; 
    v.push_back(s); 
} 
v.insert(v.end(), v.begin(), v.begin() + 3); 
for (std::string& s : v) 
    std::cout << "\"" << s.c_str() << "\" "; 

我得到什麼有 「0」 「1」 「2」 「3」 「4」 「5」 「6」 「」 「」 「」

我調試成insert方法,在vector類的_Insert(..)方法裏面,它做了一些內存重新分配,內存移動/移動等等。

第一個_Umove調用將所有7個字符串移動到新分配的內存,我認爲std :: move被調用,舊的內存剩下一些空的字符串。

然後_Ucopy方法嘗試複製3個項目,但從舊的內存中,因此附加3空字符串。 還有一個_Umove呼叫,我不確定那是什麼。在所有這些之後,舊的內存被釋放並且新的內存被附加到該載體上。

使用像int這樣的標量類型不會產生錯誤的輸出,因爲內存被複制,所以不會調用std :: move。

我在這裏做錯了什麼,或者它是MS Visual Studio的STL錯誤?

回答

1

this std::vector::insert reference

導致重新分配,如果新size()比舊capacity()更大。如果新size()capacity()更大,所有迭代器和引用都無效

[重點煤礦]

您將元素添加到向量,而使用迭代迭代器載體。由於這可能會導致向量被重新分配,您的迭代器將失效。這將導致未定義的行爲

+0

據我所知,重新分配會導致迭代器和引用無效,這應該在插入返回後發生。任何迭代器和對矢量的引用都是無效的,但是這在調用期間發生,這對我來說很奇怪。我嘗試在插入之前預留一些空間,然後工作。這只是一個解決方法。稍後我會嘗試使用其他編譯器。 –

+0

@TigerHwang您將兩個迭代器傳遞給'insert'函數。只要'insert'函數爲新元素留出空間,那些通過的迭代器就會失效。使用其他編譯器不能解決您的問題。預留空間是唯一的解決方案。 –

+0

我的對象是將向量中的一些字符串移動到最後,所以我嘗試了另一種方法std :: move(v.begin(),v.begin()+ 3,v.end())。這會導致由於迭代器+偏移量超出範圍而導致斷言失敗。使用std :: move(v.begin(),v.begin()+ 3,v.end() - 3),它不會失敗,但結果不是我想要的。任何建議? –

相關問題