2016-11-10 60 views
0

以下代碼運行時未拋出segemntation錯誤錯誤。然而,對vec.erase的調用擦除了最後一個元素,即去除「指針1」,將vec的大小減小1,並將「指針0」留下。爲什麼擦除End-Iterator不會給shared_ptr分段錯誤?

std::vector<std::shared_ptr<int>> vec; 
vec.push_back(std::make_shared<int>(0)); 
vec.push_back(std::make_shared<int>(1)); 

vec.erase(vec.end()); 

std::cout << vec.size() << std::endl 

與剛纔int相同的代碼會拋出分段錯誤錯誤,如同被忽略。

這是什麼原因?

PS:用GCC 5.2.1

+0

你不能從向量中擦除'end',因爲它引用了最後一個元素之後的元素。我猜測這是不確定的行爲。 – user463035818

+0

我知道,我在這個例子中是故意的。我很驚訝,未定義的行爲取決於向量的內容而不是容器本身。 – SamVanDonut

+0

多數民衆贊成他們爲什麼稱它爲「未定義」,如果你會得到可預見的行爲,可以定義 – user463035818

回答

2

相同的代碼只有INT拋出一個分段錯誤,如預期測試。

您的預測是錯誤的。未定義的行爲並不能保證你的程序會崩潰。這對你來說可能是一個驚喜,但行爲是不確定的。

+0

我很驚訝,未定義的行爲取決於向量的內容而不是容器本身。 – SamVanDonut