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
你不能從向量中擦除'end',因爲它引用了最後一個元素之後的元素。我猜測這是不確定的行爲。 – user463035818
我知道,我在這個例子中是故意的。我很驚訝,未定義的行爲取決於向量的內容而不是容器本身。 – SamVanDonut
多數民衆贊成他們爲什麼稱它爲「未定義」,如果你會得到可預見的行爲,可以定義 – user463035818