Следующий код работает без сброса ошибки сбоя segemntation. Однако вызов vec.erase
стирает последний элемент, то есть удаляет «указатель 1», уменьшает размер vec на один и оставляет «указатель 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
вы не можете стереть «конец» из вектора, потому что он ссылается на элемент, который прошел мимо последнего. Я бы предположил, что это неопределенное поведение. – user463035818
Я знаю, я делаю это в этом примере нарочно. Я был удивлен, что неопределенное поведение отличается в зависимости от содержимого вектора, а не от самого контейнера. – SamVanDonut
Вот почему они назвали его «неопределенным», если вы получите предсказуемое поведение, его можно определить – user463035818